02、線性表
阿新 • • 發佈:2020-11-30
儲存表示:
線性表的順序儲存表示:
線性表的鏈式表示:
迴圈列表:是另一種形式的鏈式儲存結構。其特點是表中最後一個結點的指標域指向頭結點,整個連結串列形成一個環。未完。。。。。
雙向連結串列:
頭插法(前插法):插入連結串列的頭部(頭節點之後)來建立連結串列。
尾插法(尾插法):插入到連結串列的尾部來建立連結串列。
單鏈表的轉置(反轉):
線性表的合併:
有序表的合併:
廣義表:
多重連結串列:
矩陣的多重連結串列:
注意:c語言實現的某些程式,使用前必須初始化,不初始化會有野指標,程式會奔潰。
測試:注意邊界問題,邊界的值能否取到。
順序儲存的程式碼:
#include <stdio.h> #includeView Code<malloc.h> #define MAXSIZE 100 //順序表操作注意下標的合法範圍,越界與操作有沒有全部包含,注意邊界情況。 typedef int ElemType; typedef struct{ //順序表 ElemType *elem; int length;//當前表中元素長度 }SqList; int InitList(SqList &l){ //順序表的初始化 l.elem = NULL; l.elem = (ElemType*) malloc (MAXSIZE * sizeof(ElemType));if(l.elem == NULL) return 0; l.length = -1; return 1; } int ListAdd(SqList &l,ElemType x){ //新增元素 if(l.length >= MAXSIZE) return -1; l.elem[++l.length] = x; return 1; } int ListInsert(SqList &l,ElemType x,int i){ //將元素插入在第i號位置(0 <= i <= l.length+1) if(l.length >= MAXSIZE) return-1; if(i > l.length+1 || i < 0)return -1; for(int j = l.length;j >= i;j--){ l.elem[j+1] = l.elem[j]; } l.elem[i] = x; l.length++; return 1; } int GetElem(SqList &l,int i,ElemType &e){ //取第i號位置的元素的值 if(i > l.length || i < 0) return -1; e = l.elem[i]; return 1; } int ListDelete(SqList &l,int i){ //刪除第i號位置的元素(0 <= i <= l.length) if(i > l.length || i < 0) return -1; for(int j = i;j<l.length;j++) l.elem[j] = l.elem[j+1]; l.length--; return 1; } int LocateList(SqList &l,ElemType x){ //查詢表中是否含有元素x,返回下標 int i; for(i = 0;i <= l.length;i++) if(l.elem[i] == x) return i; return -1; } void PrintList(SqList &l){ for(int i = 0;i <= l.length;i++) printf("%d ",l.elem[i]); printf("\n"); } int main(){ SqList l; int i = InitList(l); ListAdd(l,0); ListAdd(l,1); ListAdd(l,2); //ListAdd(l,3); ListInsert(l,-1,1); i = LocateList(l,0); i = GetElem(l,4,i); printf("%d\n",i); PrintList(l); ListDelete(l,3); PrintList(l); return 0; }
鏈式儲存:
#include <stdio.h> #include <malloc.h> //線性表的鏈式儲存結構 typedef int ElemType; typedef struct Node{ ElemType data; Node* next; }List,*Lp; typedef struct DuNode{ //雙向連結串列的儲存結構 ElemType data; DuNode* prior; //直接前驅 DuNode* next; //直接後繼 }DuList,*Dup; int ListInit(Lp &l){ //初始化,頭節點沒有儲存資料,操作方便 l = (Lp)malloc(sizeof(List)); if(l == NULL) return -1; l->next = NULL; return 1; } int ListAdd(Lp &l,ElemType x){ //增 Lp p = l; while(p->next != NULL){ p = p->next; } Lp t = (Lp)malloc(sizeof(List)); if(t == NULL) return -1; t->data = x; t->next = NULL; p->next = t; return 1; } int ListAdd2(Lp &l,ElemType x){ Lp t = (Lp)malloc(sizeof(List)); if(t == NULL) return -1; t->data = x; t->next = l->next; l->next = t; return 1; } int ListLocate(Lp &l,ElemType x){ //查 返回0代表未找到 int i = 0; Lp t = l->next; while(t != NULL){ i++; if(t->data == x){ return i; } t = t->next; } return 0; } int ListGet(Lp &l,int i,ElemType &e){ //取值 Lp p = l->next; for(int m = 1;m < i && p;m++ ){ p = p->next; } if(p == NULL) return -1; e = p->data; return 1; } int ListInsert(Lp &l,ElemType x,int i){ //插入的合法下標(1 <= i <= n+1)頭指標永遠不能變 Lp p = l; if(i < 1) return -1; int m = 1; while(p->next != NULL && m != i){ p = p->next; m++; } if(m == i){ Lp t = (Lp)malloc(sizeof(List)); if(t == NULL) return -1; t->data = x; t->next = p->next; p->next = t; return 1; } return -1; } int ListDelete(Lp &l,int i){ //刪除的合法下標(1 <= n )注意釋放空間 Lp p = l; if(i < 1) return -1; for(int m = 1;m < i && p->next;m++){ p = p->next; } if(p->next == NULL) return -1; Lp q = p->next; p->next = q->next; free(q); return 1; } void ListDown(Lp &l){ //單鏈表的(反轉)轉置 Lp p = l->next; l->next = NULL; while(p){ Lp q = p; p = p->next; q->next = l->next; l->next = q; } } void ListPrint(Lp &l){ Lp p = l->next; while(p){ int i = p->data; printf("%d ",i); p = p->next; } printf("\n"); } int main(){ Lp a; int i,m; ListInit(a); ListAdd(a,1); ListPrint(a); ListAdd(a,2); ListPrint(a); ListAdd2(a,3); ListAdd2(a,4); ListPrint(a); ListInsert(a,5,1); ListPrint(a); ListDelete(a,6); ListPrint(a); return 0; }View Code
注意:程式碼經過簡單測試,並不保證程式碼完全無誤。
程式碼中有可能含有c++的語法。
有些內容沒有補全(大多數為書中的定義),請自行查詢相關內容。
上一篇:01、緒論、複雜度
下一篇:持續更新中