單鏈表順序儲存相關操作的c語言實現
阿新 • • 發佈:2019-02-02
以前學資料結構時,對於單鏈表的順序儲存的原理都懂,但是從沒有好好地程式設計實現一下,現在呢,重溫資料結構,然後實現了一下.下面是原始碼.實現了初始化,建立,查詢,刪除,定位還有兩個連結串列的合併.
#include<stdio.h> #define MAXSIZE 20 #define OK 1 #define ERROR 0 #define FALSE 0 typedef int ElemType; typedef int Status; typedef struct//定義順序儲存連結串列的結構體 { ElemType data[MAXSIZE]; int length; } SqList; /****** 初始化連結串列 */ void InitSqList(SqList *sq) { sq->length=0; } /************* 建立包含有n個元素的連結串列 */ void CreatSqList(SqList *sq,int n) { int i; for(i=0; i<n; i++) { sq->data[i]=i+3;//儲存的資料從3開始主要是為了後面和另外一個連結串列合併 } sq->length=n; } void CreatSqList2(SqList *sq,int n) { int i; for(i=0; i<n; i++) { sq->data[i]=i+1; } sq->length=n; } /******* 輸出連結串列 */ void printSqList(SqList *sq) { int i; for(i=0; i<sq->length; i++) { printf("%d ",sq->data[i]); } printf("\n"); } /**** 獲取第i個位置的元素,賦值給e,成功返回ok */ Status GetElem(SqList *L,int i,ElemType *e) { if(i<1 || i>L->length || 0==L->length)//判斷位置的合理性 { return ERROR; } *e=L->data[i-1]; return OK; } /******** 連結串列在第i個位置插入元素e */ Status SqListInstert(SqList *L,int i,ElemType e) { int k; if(L->length==MAXSIZE)//判斷是否已滿 { return ERROR; } if(i<1 || i>L->length+1)//判斷插入位置是否合理 { return ERROR; } if(i<=L->length)//如是不是最後一個位置,則插入位置後面的元素全部後移,否則直接插入 { for(k=L->length-1; k>=i-1; k--) { L->data[k+1]=L->data[k]; } } L->data[i-1]=e;//賦值 L->length++;//長度加1 return OK; } /************** 刪除第i個位置的元素,返回所刪除位置的值 **/ Status SqListDelete(SqList *sq,int i,ElemType *e) { int k; if(i<1 || i>sq->length)//判斷刪除位置是否合理 { return ERROR; } *e=sq->data[i-1]; if(i<sq->length) { for(k=i-1; k<sq->length-1; k++) //被刪除元素的後面的元素全部後移 { sq->data[k]=sq->data[k+1]; } } sq->length--;//長度減1 return OK; } /*********** 判斷元素是否在連結串列中 */ Status Location(SqList *la,int e) { int i; for(i=0; i<la->length; i++) { if(e==la->data[i]) return OK; } if(i==la->length) { return ERROR; } } void UnionL(SqList *la,SqList *lb)//求la與lb的並集,把結果儲存到la中 { int la_len,lb_len;//定義連結串列a,b的長度 int i; ElemType e; la_len=la->length; lb_len=lb->length; for(i=1; i<=lb_len; i++) { if(!GetElem(lb,i,&e)) { printf("getelem fail!\n"); } if(!Location(la,e)) { SqListInstert(la,++la_len,e); } } } int main() { SqList la,lb; int result;//儲存被刪除元素的值 int elem;//儲存第i個位置的值 int n=10; int m=5; InitSqList(&la);//初始化第一個連結串列la CreatSqList(&la,n);//建立第一個連結串列la printf("the first link was created successly!\nThe first link is:\n"); printSqList(&la); SqListInstert(&la,5,50);//插入 printSqList(&la);//輸出 SqListDelete(&la,5,&result);//刪除 printf("%d\n",result); printSqList(&la); printf("Get the third elem\n"); GetElem(&la,3,&elem); printf("%d\n",elem); InitSqList(&lb); CreatSqList2(&lb,m); printf("The second list is:\n"); printSqList(&lb); UnionL(&la,&lb); printf("The union list of first and second list is:\n"); printSqList(&la); return 0; }
執行結果如圖: