數據結構上機實驗上的一道題。算法
設一帶頭結點的單鏈表,設計算法將表中值相同的元素僅保留一個結點。數據結構
提示:指針p從鏈表的第一個元素開始,利用指針q從指針p位置開始向後搜索整個鏈表,刪除與之值相同的元素;指針p繼續指向下一個元素,開始下一輪的刪除,直至p==null爲至,既完成了對整個鏈表元素的刪除相同值。ide
解題思路:按照提示的意思就是一個雙重循環的查找,像是暴力算法從母串中查找子串?我最開始就直接使用編寫好的刪除函數套在雙重循環裏面,這樣作是能夠的,可是時間複雜度有點高,O(n^3)!!!函數
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct Node 4 { 5 int data; 6 struct Node * next; 7 } Node,*LinkList; 8 int Delete(LinkList * L,int Location) 9 { 10 LinkList q,p; 11 int counts=0; 12 int k=Location+1; 13 q=(*L); 14 p=(*L)->next; 15 while(p->next) 16 { 17 q=q->next; 18 p=p->next; 19 counts++; 20 if(counts==Location) 21 { 22 q->next=p->next; 23 } 24 } 25 return 1; 26 } 27 int Unique(LinkList *L) 28 { 29 LinkList p,q; 30 int counts=1; 31 int ans=0; 32 p=(*L)->next; 33 while(p) 34 { 35 q=p->next; 36 counts=ans+1;; 37 while(q) 38 { 39 if(p->data==q->data) 40 { 41 Delete(L,counts); 42 } 43 else 44 { 45 counts++; 46 } 47 q=q->next; 48 } 49 p=p->next; 50 ans++; 51 } 52 return 1; 53 } 54 int Create(LinkList *L,int n) 55 { 56 LinkList p,q; 57 int Elem,i; 58 q=(*L); 59 printf("請按輸入元素:\n"); 60 for(i=0; i<n; i++) 61 { 62 p=(LinkList)malloc(sizeof(Node)); 63 scanf("%d",&Elem); 64 p->data=Elem; 65 q->next=p; 66 q=p; 67 } 68 p->next=NULL; 69 return 1; 70 } 71 int InitLinkList(LinkList * L) 72 { 73 (*L)=(LinkList)malloc(sizeof(Node)); 74 if((*L)==NULL) 75 { 76 printf("ERROR\n"); 77 return 0; 78 } 79 (*L)->next=NULL; 80 return 1; 81 } 82 void Print(LinkList *L) 83 { 84 LinkList p; 85 p=(*L)->next; 86 while(p) 87 { 88 printf("%d ",p->data); 89 p=p->next; 90 } 91 printf("\n"); 92 } 93 int main() 94 { 95 LinkList L; 96 int Number; 97 InitLinkList(&L); 98 printf("請輸入元素的個數:\n"); 99 scanf("%d",&Number); 100 Create(&L,Number); 101 printf("原先的元素有\n"); 102 Print(&L); 103 Unique(&L); 104 printf("去重後的元素有\n"); 105 Print(&L); 106 return 0; 107 }
更改後的去重背調函數:spa
1 int Unique(LinkList *L) 2 { 3 LinkList p,q,k; 4 q=p=(*L)->next; 5 while(p->next)///查找和節點p重複的節點,重複則刪除。 6 { 7 q=p; 8 k=q->next; 9 while(k) 10 { 11 if(k->data==p->data)///重複判斷 12 { 13 q->next=k->next;///從鏈表裏刪除 14 free(k); ///實際刪除節點,釋放內存 15 k=q->next; ///保持k=q->next; 16 } 17 else 18 { 19 q=k; 20 k=k->next; 21 } 22 } 23 if(p->next) 24 { 25 p=p->next; 26 } 27 } 28 return 1; 29 }
可以將時間複雜度將到O(n^2)設計