第2章课后习题基础题(6),勘误
作者:互联网
(6)有一个递增非空单链表,设计一个算法删除值域重复的结点。例如:{1,1,2,3,3,3,4,4,7,7,7,9,9,9}经过删除后变成{1,2,3,4,7,9}
本题有两种方法:
方法一:常规的。遍历单链表,碰到p->data==p->next->data.删除p->next结点。
方法二:由于时间原因,不在赘述,看了图挺容易懂得。
如图所示:
由于书上代码有错误,所以进行勘误
代码如下
1 #include <iostream> 2 #include<cstdio> 3 #include<vector> 4 #include<malloc.h> 5 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 6 using namespace std; 7 #define elem int 8 vector<elem> a; 9 typedef struct node{ 10 elem data; 11 struct node *next; 12 }node; 13 typedef node* Node; 14 void InitNode(Node &L){ 15 L=(Node)malloc(sizeof(node)); 16 L->next=NULL; 17 } 18 void delsl2(Node &L){ 19 Node p=L->next,q=L->next->next,r; 20 while(q!=NULL){ 21 while(q!=NULL&&q->data==p->data) 22 q=q->next; 23 24 if(q!=NULL){ 25 p=p->next; 26 p->data=q->data; 27 } 28 if(q!=NULL) 29 q=q->next; 30 31 32 } 33 q=p->next; 34 p->next=NULL;//这个地方很重要,因为如果这里不加,会发生错误,因为p->next在删除q的时候不存在了!加了后,代表把原始的单链表断裂。后面的链表已经被free掉了! 35 //在输出断链的单链表时,遍历它,才不会报错! 36 while(q!=NULL){ 37 r=q; 38 q=q->next; 39 free(r); 40 } 41 } 42 void CreateList(Node L){ 43 //存在头结点的 44 // 采用尾插法 45 Node p; 46 Node r=L; 47 for(vector<elem>::iterator it=a.begin();it!=a.end();it++){ 48 InitNode(p); 49 p->data=*it; 50 r->next=p; 51 r=p; 52 } 53 delsl2(L); 54 // 遍历一下单链表 55 p=L; 56 while(p->next!=NULL){ 57 cout<<p->next->data<<endl; 58 p=p->next; 59 } 60 61 } 62 int main(int argc, char** argv) { 63 int n; 64 cin>>n; 65 elem d; 66 Node L; 67 InitNode(L); 68 for(int i=0;i<n;i++){ 69 cin>>d; 70 a.push_back(d); 71 } 72 CreateList(L); 73 return 0; 74 }
标签:Node,node,勘误,int,next,课后,习题,NULL,data 来源: https://www.cnblogs.com/industrial-fd-2019/p/10593047.html