資料結構—連結串列的基本操作(c語言程式碼)
阿新 • • 發佈:2019-01-26
連結串列
連結串列也是一種線性表,與順序表不同之處在於不像順序表佔據一段連續的儲存空間,而是將儲存單元分散在記憶體的任意地址上。
連結串列結構中,儲存每個資料時候都會把記錄寫在連結串列的一個結點(node)中,每個結點之間由指標相連,形成如同鏈子的結構。
結點(node):可以是一個結構體型別元素,必須有一個專門來存放地址的域,用這個域來存放後繼結點的地址,這樣就連線起來
連結串列組成:通常有表頭(指標變數,存放第一個結點地址),最後一個結點的指標域要空(NULL,因為沒有後繼結點)
例項分析
/******************************************** *從終端輸入一組整數,以0為結束標誌,存放連結串列中 *列印連結串列的值 *再刪除順序表中的第五個元素,打印出結果 *最後在記憶體中釋放該連結串列 ********************************************/ #include<stdio.h> #include<conio.h> #define MaxSize 10 #include<bits/stdc++.h> /* 定義一個結構體Sqlist */ typedef struct node{ int data; //資料域 struct node *next; //指標域 }LNode, *LinkList; //自定義方式將結構定義為LNode型別 在定義一個指向LNode的指標型別變數 //LNode *L 等價於 LinkList L /* 建立一個連結串列,包含n個結點(長度為n) */ /* 引數L:Sqlist型別的指標 因為是指標所以可以在函式中直接對順序表進行操作 */ LinkList myLinkList(int n){ LinkList p, r, list = NULL; int e, i; for(i = 1; i <= n; i++) { scanf("%d", &e); //輸入結點的內容 p = (LinkList) malloc (sizeof(LNode)); //為新建的結點開闢記憶體空間 p->data = e; //元素賦值 p->next = NULL; if(!list) list = p; //賦值連結串列頭指標 else r->next = p; //將結點連入連結串列 r = p; } return list; //返回連結串列頭指標 } /******************** *向連結串列中插入結點 *引數L :Sqlist型別的指標 *引數i:插入元素的位置 *引數item:插入的元素 *********************/ void insertList(LinkList *list, LinkList q, int e) { LinkList p; p = (LinkList) malloc (sizeof(LNode)); //為新建的結點開闢記憶體空間 p->data = e; //元素賦值 if(! *list){ *list = p; p->next = NULL; } else{ p->next = q->next; q->next = p; } } /******************** *刪除連結串列某結點 *引數L :Sqlist型別的指標 *引數i:刪除元素的位置 *********************/ void delLink(LinkList *list, LinkList q) { LinkList r; if(q == *list) //如果刪除第一個結點 { *list = q->next; free(q); } else //刪除其他結點 { for(r = *list; r->next != q; r = r->next) if(r->next != NULL) { r->next = q->next; free(q); } } } /******************** *銷燬一個連結串列 *引數L :Sqlist型別的指標 *引數i:刪除元素的位置 *********************/ void destroyLinkList(LinkList *list) { LinkList p, q; p = *list; while(p) //迴圈釋放每一個連結串列結點 { q = p->next; free(p); p = q; } *list = NULL; } /******************** *測試函式 *********************/ int main() { int e, i; LinkList l, q; q = l = myLinkList(1); //建立一個連結串列結點,q和l指向該結點 scanf("%d" , &e); while(e) { insertList(&l, q, e); q = q->next; scanf("%d" , &e); } q = l; printf("連結串列內容為:\n"); while(q) { printf("%d" , q->data); q = q->next; } q = l; printf("刪除第五個結點:\n"); for(i = 0; i < 4; i++) //指標q指向連結串列第五個元素 { q = q->next; } delLink(&l, q); //刪除q指向的結點 q = l; while(q) //列印刪除後的結果 { printf("%d" , q->data); q = q->next; } destroyLinkList(&l); //釋放該連結串列 return 0; }