資料結構--連結串列(C實現)
阿新 • • 發佈:2019-01-25
連結串列是學習資料結構的基礎,何為資料結構,簡單來說就是研究資料的儲存問題,演算法是對資料的操作問題,儲存主要是個人的儲存和個人與個人的關係的儲存,研究如何將我們現實生活中各種事物及其關係的儲存。
連結串列的優缺點(相比於同是線性結構的陣列): 1.空間沒有限制 2.插入元素速度快 。但是存取速度不如陣列!
重點–排序 插入 刪除 節點的演算法
/* 2018年11月19日18:06:26 連結串列程式 */ # include <stdio.h> # include <malloc.h> # include <stdlib.h> typedef struct node { int data ; struct node * pnext ; } NODE ,* PNODE ; // 函式宣告 PNODE create_list (void) ; void traverse_list (PNODE phead ) ; //連結串列的遍歷 bool is_empty (PNODE phead) ; int length_list (PNODE phead) ; void insert_list (PNODE phead,int pos,int val) ; //在第pos個節點後面插入節點 數值是val void delete_list (PNODE phead,int pos) ; //刪除第pos個節點 void sort_list (PNODE phead) ; int main (void) { PNODE phead = NULL ; phead = create_list () ; traverse_list (phead) ; printf ("該連結串列的長度是length=%d\n",length_list(phead)) ; insert_list (phead , 3 ,9) ; printf ("在第三個元素後面插入 9\n") ; traverse_list (phead) ; printf ("在刪除第二個元素\n") ; delete_list (phead , 2) ; traverse_list (phead) ; sort_list (phead) ; traverse_list (phead) ; return 0 ; } PNODE create_list (void) { PNODE phead = (PNODE) malloc (sizeof (NODE)) ; if (NULL == phead) { printf ("分配記憶體出錯!\n") ; exit (-1) ; } int len ; int val ; // 存放臨時值 int i ; printf ("請輸入節點個數len = ") ; scanf ("%d", &len) ; phead->pnext = NULL ; PNODE ptail = phead ; //ptail 是尾結點 for (i=0; i<len; i++) { printf ("請輸入第%d個節點的數值:",i+1) ; scanf ("%d",&val) ; PNODE pnew = (PNODE) malloc(sizeof (NODE)) ; pnew->data = val ; ptail->pnext = pnew ; pnew->pnext = NULL ; ptail = pnew ; } return phead ; } void traverse_list (PNODE phead) { // 錯誤寫法 原因是頭結點不存放資料 phead->data 是個垃圾值 /*while (phead->pnext != NULL) { printf ("%d ",phead->data) ; phead = phead->pnext ; } 輸入 : 1 2 3 輸出結果 213242 1 2 */ PNODE p = phead->pnext ; //while (p->pnext !=NULL ) 這樣輸出 少一個最後資料 這樣理解 尾結點的資料域是NULL,即他指向的下個節點的地址是NULL while (p != NULL ) { printf ("%d ",p->data) ; p = p->pnext ; } printf ("\n") ; return ; } bool is_empty (PNODE phead) { if (phead->pnext ==NULL ) return true ; else return false ; } int length_list (PNODE phead) { int i = 0; PNODE p = phead->pnext ; while (p != NULL) { i++; p = p->pnext ; } return i ; } void insert_list (PNODE phead,int pos,int val) //在第pos個節點後面插入節點 數值是val { PNODE pnew = (PNODE) malloc (sizeof (NODE)) ; pnew->data = val ; PNODE p = phead->pnext ; //p 指向首節點 int i ; for (i=1; i<pos; i++) { p = p->pnext ; } pnew->pnext = p->pnext ; p->pnext = pnew ; return ; } void delete_list (PNODE phead,int pos) //刪除第pos個節點 { PNODE p = phead->pnext ; int i ; for (i=1;i<pos-1;i++) { p = p->pnext ; } PNODE t = p->pnext ; p->pnext = p->pnext->pnext ; free (t) ; return ; } void sort_list (PNODE phead) { int i ,j ; PNODE p,q ; int len = length_list (phead) ; for (i=0,q=phead->pnext; i<len-1; i++,q=q->pnext) { for (j=0,p=phead->pnext; j<len-1-i; j++,p=p->pnext) { if (p->data > p->pnext->data) { int t ; t = p->data; p->data = p->pnext->data; p->pnext->data = t; } } } }