一維陣列表示順序表 ʕ •ᴥ•ʔ
阿新 • • 發佈:2018-12-10
由於老師課件都是分開寫得 有的變數名出現了差錯 (課件被我們瘋狂吐槽) 然後小編根據昨天昨天室友的講解 寫了這篇比較簡潔的程式碼 需要能夠幫到你們~ 大家可以看完我寫的程式碼 然後再去看課件 應該就能看懂 所有連結串列 你只要學會了 插入刪除 其他的都會 由於下午有比賽沒時間寫的太詳細 見諒~~ 週一前會更新 還有就是希望各位一定要手動去實現 !!! 光會理論是不行的
#include <iostream> #include <cstdlib> using namespace std; # define LIST_INIT_SIZE 100 // 線性表儲存空間的初始分配量 # define LISTINCREMENT 10 // 線性表儲存空間的分配增量 struct Sqlist{ int *elem;//儲存空間基址 int length;//當前表長(特指元素個數) int listsize; //當前分配的儲存容量(以sizeof(ElemType)為單位) }; // 陣列存取得時候是從0位開始存得 //構造一個空的線性表L。 int initlist(Sqlist &L) { L.elem=new int[LIST_INIT_SIZE];// 空表長度為0 L.length=0; L.listsize=LIST_INIT_SIZE;// 初始儲存容量 return 1; } //銷燬函式 void destroylist(Sqlist &L) { if(L.elem) delete[] L.elem;//釋放儲存空間 L.length=0; L.listsize=0; } // 清除連結串列 void ClearList(Sqlist &L) { L.length=0;//將線性表的長度置為0 } //判空 int IsEmpty(Sqlist &L) { if(!L.length)// L.length == 0 return 1; return 0; } // 求連結串列長度 int GetLength(Sqlist &L) { return L.length; } //獲取線性表位置的元素 void GetElem(Sqlist &L,int i) { if(i<1||i>L.length)//越界 { cout<<"輸入不合法"<<endl; } else cout<<L.elem[i-1]<<endl; } //獲得前驅 void GetPre(Sqlist &L,int i) { if(i<2||i>L.length+1) { cout<<"輸入不合法"<<endl; } else cout<<L.elem[i-2]<<endl; } //獲得後繼 void GetSuc(Sqlist &L,int i) { if(i<1||i>L.length-1) { cout<<"輸入不合法"<<endl; } cout<<L.elem[i]<<endl; } int ListInsert_Sq(Sqlist &L, int i, int e) { if(i<0||i>L.length+1)//越界 { cout<<"輸入不合法"<<endl; return -1; } if(L.length==L.listsize)//當前儲存空間已滿,增加分配 { int *newbase=(int *)realloc(L.elem,(L.listsize+ LISTINCREMENT)*sizeof(int)); if(!newbase) cout<<"儲存分配失敗"<<endl; L.elem=newbase;//新基址 L.listsize += LISTINCREMENT;//增加儲存容量 } int *q=&(L.elem[i-1]); //q為插入位置 for(int *p=&L.elem[L.length-1];p>=q;p--) { *(p+1)=*p;//插入位置之後的元素右移 } *q=e;//插入e ++L.length;//長度加一 return 1; } //線性表的刪除實現 int ListDelete_Sq(Sqlist &L,int i) { if(i<1||i>L.length) { cout<<"輸入不合法"<<endl; return -1; } int *q=&(L.elem[L.length-1]);////p為被刪除元素的位置 for(int *p=&(L.elem[i-1]);p<q;p++) { *p=*(p+1); //被刪除元素之後的元素左移 } --L.length; //表長減1 } //顯示線性表 int Show_Sq(Sqlist &L) { for(int i=0;i<L.length;i++) { cout<<L.elem[i]<<endl; } return 1; } void show_help() { cout << "1----清空線性表" << endl; cout << "2----判斷線性表是否為空" << endl; cout << "3----求線性表長度" << endl; cout << "4----獲取線性表指定位置元素" << endl; cout << "5----求前驅" << endl; cout << "6----求後繼" << endl; cout << "7----線上性表指定位置插入元素" << endl; cout << "8----刪除線性表指定位置元素" << endl; cout << "9----顯示線性表" << endl; cout << " 退出,輸出一個負數!" << endl; } int main() { int operate_code; show_help(); Sqlist L; initlist (L); int e,i; while(1) { cout << "請輸入操作程式碼:"; cin >> operate_code; if (operate_code == 1) { //呼叫操作函式1 ClearList(L); cout << "the list is empty now" << endl; } else if (operate_code == 2) { if (IsEmpty(L)) cout << "The list is empty" << endl; else cout << "The list is not empty" << endl; } else if (operate_code == 3) { cout << "the length of list is:" << GetLength(L) << endl; } else if (operate_code == 4) { cout << "請輸入線性表元素的位置:" << endl; cin >> i; GetElem(L,i); } else if (operate_code == 5) { cout << "請輸入元素的位置:" << endl; cin >> i; GetPre(L, i); } else if (operate_code == 6) { cout << "請輸入元素的位置:" << endl; cin >> i; GetSuc(L, i); } else if (operate_code == 7) { cout << "請輸入插入元素及其位置:" << endl; cin >> e >> i; ListInsert_Sq(L, i, e); cout << "e=" << e << " " << "i=" << i << endl; } else if (operate_code == 8) { cout << "請輸入刪除元素位置:" << endl; cin >> i; ListDelete_Sq(L, i); cout << "已刪除" << endl; } else if (operate_code == 9) { Show_Sq(L); } else if (operate_code<0) { break; } else { cout << "\n操作碼錯誤!!!" << endl; show_help(); } } //呼叫銷燬線性表函式 destroylist(L); return 0; }
一之前會更新完成!