第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 }

 

转载于:https://www.cnblogs.com/industrial-fd-2019/p/10593047.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值