嚴蔚敏版資料結構——單鏈表
阿新 • • 發佈:2018-12-11
嚴蔚敏版資料結構——單鏈表的操作
記得前上個禮拜,我寫過的一個版本的單鏈表的建立。今天寫下了這個嚴蔚敏版的單鏈表。梳理了一下思路,其基本演算法還是一樣的,還是那句話,理解,理解,理解最重要。這個版本的單鏈表我要提醒自己的是:1、這是直接在函式中採用引用LinkList & (注意這是引用,不是取指標地址) 對地址進行操作;上個版本是函式返回一個指向結構體指標的指標這種方法;(我還要說明一點:如果這兩種方法都不採用,那就要用指向指標的指標,雙重指標來操作,當然這是很複雜哦,因為我們的連結串列說到底就是一個指標,一般我們採用以上兩種方法即可)2、記住一點,不改變連結串列引數傳值就行,即連結串列就行(LinkList head),要操作連結串列最簡單一種做法就是用引用的方法傳地址,這不是——指向結構體LNode的指標的地址,而是引用、引用、引用。詳情參考下一篇部落格 int & 到底是個啥(LInkList & head)。
還是那句話,程式碼是最精簡的解釋,上程式碼欣賞。
程式碼親測完美執行:
/* item是暫時用來遍歷元素的指標 pnew是新建立的結點指標 pend是連結串列的尾結點 */ #include<stdio.h> #include<malloc.h> #define OK 1 #define ERROR 0 typedef struct LNode { int data; struct LNode *next; }LNode,*LinkList; //---------------前插法建立單鏈表;---------------- void CreatList_H(LinkList &head,int n) { int i;LinkList pnew; //先建立頭結點,資料為空; head=(LinkList)malloc(sizeof(LNode)); head->next=NULL; for(i=0;i<n;i++) { pnew=(LinkList)malloc(sizeof(LNode)); scanf("%d",&pnew->data); pnew->next=head->next; head->next=pnew; } } //--------------後插法建立單鏈表 ------------------ void CreateList_E (LinkList &head,int n) { int i; LinkList pnew; LinkList pend;//定義最後的節點指標; //先建立頭結點,資料為空; head=(LinkList)malloc(sizeof(LNode)); head->next=NULL; pend=head;//頭結點是最後的節點 ; for(i=0;i<n;i++) { pnew=(LinkList)malloc(sizeof(LNode)); printf("請輸入第%d個節點的資料:\n"); scanf("%d",&pnew->data); pnew->next=NULL; pend->next=pnew; pend=pnew; } } //-------------單鏈表的取值-------------- int GetElem(LinkList head,int i,LNode &elem ) { int j=1; LinkList item; item=head->next; while(item&&j<i) { item=item->next; j++; } if(item==NULL||j>i)// { return ERROR; } elem.data=item->data; return OK; } //-----------------單鏈表的查詢------------------ LinkList LocateElem(LinkList head,LNode elem) { LinkList item; item=head->next; while(item!=NULL&&item->data!=elem.data) { item=item->next; } return item; } //------------------插入元素--------------- int ListInsert (LinkList &head,int i,LNode elem) { LinkList item,pnew; int j=0; item=head; while(item&&(j<i-1))//查詢第i-1個結點,item指向它 { item=item->next; ++j; } if(!item||j>i+1) return ERROR; pnew=(LinkList)malloc(sizeof(LNode)); pnew->data=elem.data; pnew->next=item->next; item->next=pnew; return OK; } //------------------列印連結串列---------------- void PrintList(LinkList head) { LinkList item; item=head; item=item->next;//這一步不是必須要做的,為了跳過頭結點(沒有資料) while(item!=NULL) { printf("----%d----\n",item->data); item=item->next; } } //--------------刪除元素 ------------------- int DeleteElem(LinkList &head,int i) { LinkList item,del; int j=0; item=head; while((item->next)&&(j<i-1)) { item=item->next; ++j; } if(!(item->next)||(j>i-1)) return ERROR; del=item->next; //item->next=item->next->next; item->next=del->next; delete del; return OK; } int main() { LinkList L; LNode e1,e2;//用來測試的 int n; int e2_data; //-------------建立列表測試------------ printf("輸入要建立的連結串列結點個數:\n"); scanf("%d",&n); printf("輸入%d個數據:\n",n); CreatList_H(L,n); printf("\n打印出來看看!\n"); PrintList(L); //-----------取值測試 ----------------- printf("輸入要取值的位置:\n"); scanf("%d",&n); GetElem(L,n,e1); printf("\n--該位置上取出的的資料是-%d--\n",e1.data); ////------------查詢測試------------ ---- printf("請輸入要查詢的元素的值e2:\n"); scanf("%d",&e2.data); e2_data=LocateElem(L,e2)->data; printf("e2該元素上的資料是%d\n",e2_data); //-------------刪除測試--------------- printf("請輸入要刪除元素的位置:\n"); scanf("%d",&n); DeleteElem(L,n); printf("\n刪除後的連結串列如下:\n"); PrintList(L); //-----------插入測試---------------- printf("輸入要插入的位置:\n"); scanf("%d",&n); ListInsert(L,n,e2); printf("\n插入後的連結串列如下:\n"); PrintList(L); return 0; }
連結串列到此完結!
博主水平不高,如有失誤處懇望指出