連結串列(查詢、插入、刪除)
阿新 • • 發佈:2022-04-13
建立節點: struct node { int data; struct node *next; }
連結串列中重複元素的刪除: #include <stdio.h> #include <stdlib.h> struct node { int data; struct node *next; }; //建立節點 struct node *head,*p,*q,*now; //比較喜歡在全域性定義節點 struct node *creat(int n) //建立連結串列 { head=(struct node *)malloc (sizeof (struct node)); head->next=NULL; for (int i=0;i<n;i++) { p=(struct node *)malloc (sizeof (struct node)); scanf("%d",&p->data); p->next=head->next; //逆序建連結串列 head->next=p; } returnhead; }; int ans; void del(struct node *head) //刪除操作 { now=head; //選定節點作為比較的基準,用now指向它 while (now) { p=now; //兩個遊動指標,其中p是q的前驅,當需要刪除操作時,直接讓前驅的指標域儲存需刪除節點q的指標域儲存的地址。 q=p->next; while (q) // q到末尾了就不能繼續移動了 { if (q->data==now->data) { ans++; p->next=q->next; free(q); q=p->next; //刪除掉p節點後要讓p重新指向q的下一個節點。需要注意的是,刪除操作結束後,now後移,而p依賴於now,q又依賴於p,從而實現了雙指標後移的過程 } else { p=q;//不需要刪除時,雙指標同時後移 q=q->next; } } now=now->next;//基準值後移 } } void print() { while (p) { printf("%d",p->data); if (p->next)printf(" "); p=p->next; } printf("\n"); } int main() { int n; scanf("%d",&n); creat(n); printf("%d\n",n); p=head->next; print(); del(head); printf("%d\n",n-ans); p=head->next; print(); return 0; }