資料結構——靜態連結串列
阿新 • • 發佈:2019-01-07
說明:嚴蔚敏的《資料結構》(C語言版)學習筆記,記錄一下,以備後面檢視。
#include <stdio.h> const int OK = 1; //定義正確返回 const int ERROR = -1; //定義錯誤的返回 const int OVERFLOW = -2; //定義溢位 #define MAXSIZE 1000 //連結串列的最大長度 //定義元素型別 typedef int ElemType; //定義返回型別 typedef int Status; //定義結點 typedef struct{ ElemType data; int cur; //下一個元素的下標 }component, SLinkList[MAXSIZE]; //獲取連結串列元素e的下標 int LocateElem_SL(SLinkList S, ElemType e){ int i = S[0].cur; //S[0]是頭結點 while(i && S[i].data != e){ i = S[i].cur; } return i; } //初始化一個連結串列(備用空間) void InitSpace_SL(SLinkList &space){ int i; for(i=0; i<MAXSIZE-1; ++i) space[i].cur = i+1; space[MAXSIZE-1].cur = 0; } //獲取頭結點 int Malloc_SL(SLinkList &space){ int i = space[0].cur; //獲取頭結點 //判斷備用空間連結串列非空(如果是空則i=0,直接返回0,否則返回分配結點的下標) if(space[0].cur) { //下一個結點作為頭結點 space[0].cur = space[i].cur; } return i; } //顯示連結串列 void Show_SL(SLinkList &space){ printf("連結串列的列印結果是\n"); int s = Malloc_SL(space); //指向頭結點 while(space[s].cur != 0){ s = Malloc_SL(space); printf("%d\n", space[s].data); } printf("\n"); } //將下標為k的空閒結點回收到備用空間(相當於頭插法,插入備用空間) void Free_SL(SLinkList &space, int k){ space[k].cur = space[0].cur; space[0].cur = k; } //依次輸入集合A和集合B的元素,在一維陣列space中建立表示集合(A-B)U(B-A) //的靜態連結串列,S為其頭指標,假裝置用空間足夠大,space[0].cur為其頭指標 void difference(SLinkList &space, int &S){ InitSpace_SL(space); //初始化備用空間 S = Malloc_SL(space); //生成S的頭結點 int r = S; printf("請輸入A,B集合的元素個數,用逗號隔開\n"); int m,n; scanf("%d,%d", &m, &n); int i,j; printf("請依次輸入A集合的元素並按回車\n"); int nn; //給A集合新增資料 for(j=1; j<=m; ++j){ i = Malloc_SL(space); //取出下一個空間索引 scanf("%d", &nn); //賦值 space[i].data = nn; space[r].cur = i; //尾插法(r指向的是最後一個結點,讓上一次最後結點指向i索引) r = i; //r指向最後的節點 } space[r].cur = 0; //將最後一個結點指向空(也就是0) printf("請依次輸入B集合的元素\n"); int b; int p; int k; for(j = 1; j<=n; ++j){ scanf("%d", &b); //讀取並記錄到臨時變數b p = S; //記錄頭結點 k = space[S].cur; //k指向第一個結點 while(k != space[r].cur && space[k].data != b){ p = k; k = space[k].cur; //指向下一個結點 } if(k == space[r].cur){ //不存在元素b,插入到r所指結點之後 i = Malloc_SL(space); space[i].data = b; space[i].cur = space[r].cur; space[r].cur = i; }else{ //存在元素b,刪除 space[p].cur = space[k].cur; Free_SL(space, k); if(r == k) r = p; } } //指回頭指標 space[0].cur = S; } int main(){ SLinkList sl; int s; difference(sl, s); Show_SL(sl); printf("finish....\n"); scanf("%d"); return 0; }
這種描述方法便於在不設“指標”型別的高階程式設計語言中使用連結串列結構,這種用陣列描述的連結串列叫靜態連結串列。