要求如下:输入一组数据,以-1结尾。将该组数据中相同的删去,再进行排序后输出,要求用链表实现。
本人的代码如下,总是出错,无法运行。
调试了一下感觉是空指针的问题,但这部分内容始终没太搞明白应该怎么弄……
本人的代码如下,总是出错,无法运行。
调试了一下感觉是空指针的问题,但这部分内容始终没太搞明白应该怎么弄……
#include<iostream>
using namespace std;
struct Node
{
int content;
Node *next;
};
Node *input()
{
Node *h=NULL;//从表头插入数据
int x;
cin>>x;
while(x!=-1)
{
Node *p=new Node;
p->content=x;
p->next=h;
h=p;
cin>>x;
}
return h;
}
void sort(Node *h)//排序
{
for(Node *p=h;p!=NULL;p=p->next)
{
for(Node *q=p->next;q!=NULL;q=q->next)
{
if(q->content>p->content)
{
int temp=q->content;
q->content=p->content;
p->content=temp;
}
}
}
}
void output(Node *h)
{
for(Node *p=h;p!=NULL;p=p->next)
cout<<p->content<<",";
cout<<endl;
}
void remove(Node *h)
{
while(h!=NULL)
{
Node *p=h;
h=h->next;
delete p;
}
}
int main()
{
Node *h=NULL;
h=input();
for(Node *p=h;p!=NULL;p=p->next)//查重
{
Node *r=p;
for(Node *q=p->next;q!=NULL;q=q->next)
{
if(q->content!=p->content)
r=q;//循环查找q的前一个结点
if((r!=NULL)&&(p->content=q->content))//找到相同的,删除结点
{
r->next=q->next;
delete q;
}
}
}
sort(h);
output(h);
delete(h);
return 0;
}
解决方案
2
if((r!=NULL)&&(p->content=q->content))应该是if((r!=NULL)&&(p->content==q->content))
#include<iostream>
using namespace std;
struct Node
{
int content;
Node *next;
};
Node *input()
{
Node *h=NULL;//从表头插入数据
int x;
cin>>x;
while(x!=-1)
{
Node *p=new Node;
p->content=x;
p->next=h;
h=p;
cin>>x;
}
return h;
}
void sort(Node *h)//排序
{
for(Node *p=h;p!=NULL;p=p->next)
{
for(Node *q=p->next;q!=NULL;q=q->next)
{
if(q->content>p->content)
{
int temp=q->content;
q->content=p->content;
p->content=temp;
}
}
}
}
void output(Node *h)
{
for(Node *p=h;p!=NULL;p=p->next)
cout<<p->content<<",";
cout<<endl;
}
void remove(Node *h)
{
while(h!=NULL)
{
Node *p=h;
h=h->next;
delete p;
}
}
int main()
{
Node *h=NULL;
h=input();
for(Node *p=h;p!=NULL;p=p->next)//查重
{
Node *r=p;
for(Node *q=p->next;q!=NULL;q=q->next)
{
if(q->content!=p->content)
r=q;//循环查找q的前一个结点
if((r!=NULL)&&(p->content==q->content))//找到相同的,删除结点
{
r->next=q->next;
delete q;
}
}
}
sort(h);
output(h);
delete(h);
return 0;
}
26
24
去重的算法是错误
应该这么处理:
1)当不重复时,
前一个节点r 后移 一个节点;
当前节点q 后移一个节点;
2)当重复时候,
前一个节点 r 不动,从链上 取下 节点 q
方法是 r->next=q->next;
删除节点 q
指针 q 设置为 r 的下个节点 (即删除掉的节点的下个节点)
删除一个节点,有两个动作
第一个1个为 ,从链上取下,保持链表是完整的
第二个为 释放 节点的内存
最后,为了保持 r 始终是 q 的前一个节点,
让 q 指针指向r 的下个节点
去重代码 中。
不变性为 q == r->next;
循环算法的一个重要原则,就是循环不变性
设计好循环不变性。则 每一轮循环,可以保证是正确进行的。
因此,循环不变性得到保障后,
可以证明,这个个循环的设计是正确的,没有错误的。
应该这么处理:
1)当不重复时,
前一个节点r 后移 一个节点;
当前节点q 后移一个节点;
2)当重复时候,
前一个节点 r 不动,从链上 取下 节点 q
方法是 r->next=q->next;
删除节点 q
指针 q 设置为 r 的下个节点 (即删除掉的节点的下个节点)
删除一个节点,有两个动作
第一个1个为 ,从链上取下,保持链表是完整的
第二个为 释放 节点的内存
最后,为了保持 r 始终是 q 的前一个节点,
让 q 指针指向r 的下个节点
去重代码 中。
不变性为 q == r->next;
循环算法的一个重要原则,就是循环不变性
设计好循环不变性。则 每一轮循环,可以保证是正确进行的。
因此,循环不变性得到保障后,
可以证明,这个个循环的设计是正确的,没有错误的。
4
if((r!=NULL)&&(p->content=q->content))应该是if((r!=NULL)&&(p->content==q->content))
已修改,仍不能运行这样改呢:
啊可以了呢~可是为什么要加一步q = r呢?能解释一下吗?
否则你循环后是去取q->next取的是一个删除掉的值的next