演算法的樂趣c/c++ —— 2.1連結串列的實現
阿新 • • 發佈:2018-12-26
宣告:參考書籍《演算法筆記》 作者:作者: 胡凡 / 曾磊 出版社: 機械工業出版社 ISBN: 9787111540090
單向連結串列的實現
首先我們需要建立一個 struct 結構體,結構體裡面建立兩個變數,一個變數用於存放資料,另外一個用於存放地址(存放的是下一個節點的地址)。然後利用這個struct建立單向連結串列。
#include<stdio.h> #include<stdlib.h> struct node{ int data; node* next; }; node* create(int Array[], int n) { node *p, *head, *pre; //建立head用於存放首地址,p用於建立新的地址,pre用於存放下一個下一個節點的中間變數 head = new node; head->next = NULL; //head的下一個地址暫時為NULL pre = head; //將head賦值給 pre for(int i=0; i<n; i++) //迴圈建立n個節點 { p = new node; //p為新的節點 p->data = Array[i]; //建立p的同時給p賦值 p->next = NULL; //因為p的下一個節點還未建立,所以p->next =NULL pre->next = p; //pre為上一個節點,將上一個節點的 ->next設定為p pre = p; //將p賦值給pre用於建立下一個節點時賦值地址 } return head; //返回頭結點 } //查詢函式 int search(node* head, int x) //查詢到 x 的數量 { int count = 0; //用於存放x的數量 node *p = head->next; //p是指標,指向的是第二個節點地址,因為head只存放地址,所以head不可能是x while(p != NULL) //只要沒到最後一個節點就一直迴圈 { if(p->data == x) count++; p = p->next; //p指向下一個地址 } return count; } //插入函式 void insert(node* head,int pos, int x) //在給定的位置插入資料 { node *p = head; //p為節點 for(int i=0; i<pos-1; i++) p = p->next; //將p定位到pos的位置處 node* q = new node; //q為新的節點 q->data = x; //q得值為x 。q的下一個地址為p的下一個地址 。p的下一個地址為q q->next = p->next; p->next = q; } //刪除函式 void del(node *head, int x) //刪除所有的x { node *p = head->next; //p為下一個節點 node *pre = head; //pre儲存上一個節點 while(p != NULL) { if(p->data == x) //達到尋找的條件 { pre->next = p->next; //p上一個節點儲存的地址變為p儲存的地址 delete(p); //刪除p p = pre->next; //p變成pre的下一個節點 } else //將p跟pre後移一位 { pre = p; p = p->next; } } }