诚心求助,运行时出现Deug Assertion Faild,用C++做数据结构链表合并的,懂的请进来帮下忙说下自己的意见吧

sirzhangyu 2008-11-17 12:32:13
#include<iostream>
using namespace std;
#define NULL 0
typedef int ELEM;
class link{
public:
ELEM element;
link *next;
link()
{element=NULL; next=NULL;}
~link(){}
};
class list{
private:
link* head;
link* curr;
public:
list();
~list();
void create();
void display();
friend void merge(list,list);
};
list::list(){head=curr=new link;}
list::~list(){
while(head!=NULL){
curr=head;
head=head->next;
delete curr;
}
}
void list::display(){
curr=head;
while(curr->next!=NULL){
cout<<curr->next->element<<" ";
curr=curr->next;
}
cout<<endl;
}
void list::create(){
ELEM e;
cout<<"请输入链表第一个数据(输入-999时结束):\n";
cin>>e;
while(e!=-999){
link* temp=new link;
curr->next=temp;
curr=curr->next;
curr->element=e;
cout<<"请输入链表下一个数据:\n";
cin>>e;
}
}
void merge(list a,list b){
a.curr=a.head;
b.curr=b.head;
while(a.curr->next!=NULL){a.curr=a.curr->next;}
while(b.curr->next!=NULL){
a.curr->next=b.curr->next;
a.curr=a.curr->next;
b.curr=b.curr->next;
a.curr->next=NULL;
}
}
int main()
{
list a,b;
cout<<"输入第一个链表:"<<endl;
a.create();
cout<<"输入第二个链表:"<<endl;
b.create();
merge(a,b);
a.display();
return 0;
}



运行时出现Deug Assertion Faild,问题应该出在merge函数,因为如果把merge(a,b)去掉,a.display()能正确显示a链表,但是我不知道是什么问题,看了很久都觉得没问题
...全文
80 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
应该是一个Assert宏的报错,可能是那一个库里头的。从程序的字面上看是没有的。

void merge(list a,list b){
a.curr=a.head;
b.curr=b.head;
while(a.curr->next!=NULL){a.curr=a.curr->next;}
while(b.curr->next!=NULL){
a.curr->next=b.curr->next;
a.curr=a.curr->next;
b.curr=b.curr->next;
a.curr->next=NULL;
}
}

第二个While循环里头应该有问题。
while(b.curr->next!=NULL){
a.curr->next=b.curr->next;
a.curr=a.curr->next;
b.curr=b.curr->next;
a.curr->next=NULL;
}
当while循环到达链表b最后一个元素时,是不存在b.curr->next元素的,这样是不正确的。另外你的链接也欠妥当,你试一下如下的while程序
while(b.curr!=NULL){
a.curr->next=b.curr;
a.curr=a.curr->next;
b.curr=b.curr->next;
a.curr->next=NULL;
}
sirzhangyu 2008-11-17
  • 打赏
  • 举报
回复
感谢了,弄好了 不过不太清楚两个指针符号**是什么,我C++才开始学不久,只学了基础
第一位虽然没解决问题,不过还是感谢你回答。
就呆在云上 2008-11-17
  • 打赏
  • 举报
回复
上面还是没有解决问题
呵呵
我再给你修改版本的
应该是问题了
而且最后释放了a的空间。
#include <iostream> 
using namespace std;
#define NULL 0
typedef int ELEM;
class link{
public:
ELEM element;
link *next;
link() {
element=NULL;
next=NULL;
}
~link(){}
};
class list{
private:

link* head;
link* curr;
public:
list();
~list();
void create();
void display();
friend void merge(list**,list*);
};
list::list(){
head=curr=new link;
}
list::~list(){
while(head!=NULL){
curr=head;
head=head->next;
delete curr;
curr = NULL;
}
}
void list::display(){
curr=head;
while(curr->next!=NULL){
cout <<curr->next->element <<" ";
curr=curr->next;
}
curr = head;
cout <<endl;
}
void list::create(){
ELEM e;
cout <<"请输入链表第一个数据(输入-999时结束):\n";
cin>>e;
while(e!=-999){
link* temp=new link;
temp->element=e;
curr->next=temp;
curr=curr->next;
cout <<"请输入链表下一个数据:\n";
curr->next = NULL;
cin>>e;
}
}
void merge(list **a,list *b){
(*a)->curr=(*a)->head;
link *p = b->head->next;
while((*a)->curr->next!=NULL){(*a)->curr=(*a)->curr->next;}

while(p != NULL){
link* temp=new link;
temp->element = p->element;
temp->next = NULL;
(*a)->curr->next = temp;
(*a)->curr = (*a)->curr->next;
p = p->next;
}
}
int main()
{
list *a = new list,b;
cout <<"输入第一个链表:" <<endl;
a->create();
cout <<"输入第二个链表:" <<endl;
b.create();
a->display();
b.display();
merge(&a,&b);
a->display();
delete(a);
return 0;
}
就呆在云上 2008-11-17
  • 打赏
  • 举报
回复
首先我修改了一下插入,其次,你的merge函数这样不行的,你要修改一个链表的内部结构就要用二级指针
修改如下:
#include <iostream> 
using namespace std;
#define NULL 0
typedef int ELEM;
class link{
public:
ELEM element;
link *next;
link() {
element=NULL;
next=NULL;
}
~link(){}
};
class list{
private:

link* head;
link* curr;
public:
list();
~list();
void create();
void display();
friend void merge(list**,list*);
};
list::list(){
head=curr=new link;
}
list::~list(){
while(head!=NULL){
curr=head;
head=head->next;
delete curr;
}
}
void list::display(){
curr=head;
while(curr->next!=NULL){
cout <<curr->next->element <<" ";
curr=curr->next;
}
cout <<endl;
}
void list::create(){
ELEM e;
cout <<"请输入链表第一个数据(输入-999时结束):\n";
cin>>e;
while(e!=-999){
link* temp=new link;
temp->element=e;
curr->next=temp;
curr=curr->next;
cout <<"请输入链表下一个数据:\n";
curr->next = NULL;
cin>>e;
}
}
void merge(list **a,list *b){
(*a)->curr=(*a)->head;
b->curr=b->head;
while((*a)->curr->next!=NULL){(*a)->curr=(*a)->curr->next;}
/*
while(b.curr->next!=NULL){
a.curr->next=b.curr->next;
a.curr=a.curr->next;
b.curr=b.curr->next;
a.curr->next=NULL;
}
*/
(*a)->curr->next = b->curr->next;
}
int main()
{
list *a = new list,b;
cout <<"输入第一个链表:" <<endl;
a->create();
cout <<"输入第二个链表:" <<endl;
b.create();
a->display();
b.display();
merge(&a,&b);
a->display();
return 0;
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧