資料結構實驗之連結串列:單鏈表中重複元素的刪除
阿新 • • 發佈:2018-12-23
資料結構實驗之連結串列七:單鏈表中重複元素的刪除
按照資料輸入的相反順序(逆位序)建立一個單鏈表,並將單鏈表中重複的元素刪除(值相同的元素只保留最後輸入的一個)。
Input:
第一行輸入元素個數 n (1 <= n <= 15);
第二行輸入 n 個整數,保證在 int 範圍內。
Output:
第一行輸出初始連結串列元素個數;
第二行輸出按照逆位序所建立的初始連結串列;
第三行輸出刪除重複元素後的單鏈表元素個數;
第四行輸出刪除重複元素後的單鏈表。
Sample Input:
10
21 30 14 55 32 63 11 30 55 30
Sample Output:
10
30 55 30 11 63 32 55 14 30 21
7
30 55 11 63 32 14 21
#include<stdio.h> #include<stdlib.h> struct node { int data; struct node *next; }; int main() { int n, i; node *head = NULL; //逆序建連結串列,只用一個頭就行,讓這個頭為空。 scanf("%d",&n); for(i=1;i<=n;i++) { node *p = new node; scanf("%d",&p->data); p->next = head ; head = p; } //逆序建個連結串列嘍。 node *p, *q, *r; printf("%d\n",n); p = head; while(p) { if (p->next!= NULL) printf("%d ",p->data); else printf("%d\n",p->data); p = p->next; } //輸出沒刪之前的連結串列。 p = head; while(p) { r = p; q = r->next; //注意這個r和q是一起的,q用來判斷是否重複,r用來刪除。 while(q) { if(q->data == p->data) { r->next = q->next; free(q); q = r->next; n--; //刪一個數n減一。 } else { r = r->next; q = q->next; } } //這個while迴圈完,表示第一個數相同的已經刪完,接著下一個。 p = p->next; } printf("%d\n",n); p = head; while(p) { if (p->next!= NULL) printf("%d ",p->data); else printf("%d\n",p->data); p = p->next; } //輸出刪除後的,就這樣搞定了呢。 return 0; }
主要是:
1 逆序。
2 建p, r作用是什麼,p,r和一起的作用是找到相同的元素,並且刪除。
3 連結串列的修改可以用定義的一個新指標來修改,比如這個題,用r修改這個連結串列。
越努力,越幸運。給自己加油!!!!