1. 程式人生 > 其它 >連結串列(查詢、插入、刪除)

連結串列(查詢、插入、刪除)

建立節點:
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; } return
head; }; 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; }