链表清空函数有有关问题但不知道出在哪…运行到第五步出错…求帮助求解释…本人新手…
链表清空函数有问题但不知道出在哪…运行到第五步出错……求帮助求解释……本人新手……
#include <iostream.h>
#include<stdlib.h>
#define ok 1
#define error 0
typedef int ElemType;
typedef int status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,* LinkList; //单链表存储结构
void CreateList(LinkList &L,int n){
LinkList s,r;
int i,m;
L=(LinkList )malloc(sizeof(LNode));
L->next=NULL;
r=L;
cout<<"请输入元素:"<<endl;
for (i=0;i<n;i++)
{
s=(LinkList)malloc(sizeof(LinkList));
cin>>m;
s->data=m;
r->next=s;
r=s;
}
r->next=NULL;
} //尾插法创建链表
void MergeList( LinkList &La, LinkList &Lb, LinkList &Lc)
{
LinkList pa=La->next;
LinkList pb=Lb->next;
LinkList pc;
Lc=pc=La;
while(pa&&pb)
{
if(pa->data<=pb->data)
{pc->next=pa; pc=pa; pa=pa ->next;}
else
{pc->next=pb; pc=pb; pb=pb->next;}
}
pc->next=pa?pa:pb;
free(Lb); Lb=NULL;
} //实现两个有序表的合并
status PrintList(LinkList L)
{
LinkList p=L->next;
LinkList px;
LinkList Lx=(LinkList)malloc(sizeof(LNode));
Lx->next=NULL;
if(p==NULL)
cout<<"链表为空!"<<endl;
while(p)
{
LinkList px=(LinkList)malloc(sizeof(LNode));
px->data=p->data;
px->next=Lx->next;
Lx->next=px;
px=px->next;
p=p->next;
} //利用头插法倒序存储链表
px=Lx->next;
while(px)
{
cout<<' '<<px->data;
px=px->next;
}
cout<<endl;
return ok;
} //输出链表
status ClearList(LinkList &L)
{
if (!L) { cout<<"ERROR"; return 0;}
LinkList q,p=L->next;
while(p)
{
q=p;
p=p->next;
free(q);
}
L->next=NULL;
return ok;
}//清空链表
int main()
{
LinkList La,Lb,Lc;
int x=1,a,b;
while(x<=5)
{
cout<<"(1)创建单链表La并按递增顺序赋值"<<endl;
cout<<"(2)创建单链表Lb并按递增顺序赋值"<<endl;
cout<<"(3)将La和Lb按原来顺序合并到Lc中"<<endl;
cout<<"(4)输出链表Lc"<<endl;
cout<<"(5)清空链表Lc"<<endl;
cout<<"(6)退出"<<endl;
cout<<"请输入选项"<<endl;
cin>>x;
switch(x)
{
case 1:
cout<<"请输入元素个数:"<<endl;
cin>>a;
CreateList(La,a);
break;
case 2:
cout<<"请输入元素个数:"<<endl;
cin>>b;
CreateList(Lb,b);
break;
case 3:MergeList(La,Lb,Lc);
break;
case 4:PrintList(Lc);
break;
case 5:ClearList(Lc);
break;
}
}//while
return ok;
}
------解决方案--------------------
你创建链表时,申请节点内存时出错了,头节点的申请是对的。
#include <iostream.h>
#include<stdlib.h>
#define ok 1
#define error 0
typedef int ElemType;
typedef int status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,* LinkList; //单链表存储结构
void CreateList(LinkList &L,int n){
LinkList s,r;
int i,m;
L=(LinkList )malloc(sizeof(LNode));
L->next=NULL;
r=L;
cout<<"请输入元素:"<<endl;
for (i=0;i<n;i++)
{
s=(LinkList)malloc(sizeof(LinkList));
cin>>m;
s->data=m;
r->next=s;
r=s;
}
r->next=NULL;
} //尾插法创建链表
void MergeList( LinkList &La, LinkList &Lb, LinkList &Lc)
{
LinkList pa=La->next;
LinkList pb=Lb->next;
LinkList pc;
Lc=pc=La;
while(pa&&pb)
{
if(pa->data<=pb->data)
{pc->next=pa; pc=pa; pa=pa ->next;}
else
{pc->next=pb; pc=pb; pb=pb->next;}
}
pc->next=pa?pa:pb;
free(Lb); Lb=NULL;
} //实现两个有序表的合并
status PrintList(LinkList L)
{
LinkList p=L->next;
LinkList px;
LinkList Lx=(LinkList)malloc(sizeof(LNode));
Lx->next=NULL;
if(p==NULL)
cout<<"链表为空!"<<endl;
while(p)
{
LinkList px=(LinkList)malloc(sizeof(LNode));
px->data=p->data;
px->next=Lx->next;
Lx->next=px;
px=px->next;
p=p->next;
} //利用头插法倒序存储链表
px=Lx->next;
while(px)
{
cout<<' '<<px->data;
px=px->next;
}
cout<<endl;
return ok;
} //输出链表
status ClearList(LinkList &L)
{
if (!L) { cout<<"ERROR"; return 0;}
LinkList q,p=L->next;
while(p)
{
q=p;
p=p->next;
free(q);
}
L->next=NULL;
return ok;
}//清空链表
int main()
{
LinkList La,Lb,Lc;
int x=1,a,b;
while(x<=5)
{
cout<<"(1)创建单链表La并按递增顺序赋值"<<endl;
cout<<"(2)创建单链表Lb并按递增顺序赋值"<<endl;
cout<<"(3)将La和Lb按原来顺序合并到Lc中"<<endl;
cout<<"(4)输出链表Lc"<<endl;
cout<<"(5)清空链表Lc"<<endl;
cout<<"(6)退出"<<endl;
cout<<"请输入选项"<<endl;
cin>>x;
switch(x)
{
case 1:
cout<<"请输入元素个数:"<<endl;
cin>>a;
CreateList(La,a);
break;
case 2:
cout<<"请输入元素个数:"<<endl;
cin>>b;
CreateList(Lb,b);
break;
case 3:MergeList(La,Lb,Lc);
break;
case 4:PrintList(Lc);
break;
case 5:ClearList(Lc);
break;
}
}//while
return ok;
}
------解决方案--------------------
你创建链表时,申请节点内存时出错了,头节点的申请是对的。
- C/C++ code
#include <iostream> #include <stdlib.h> using namespace std; #define ok 1 #define error 0 typedef int ElemType; typedef int status; typedef struct LNode { ElemType data; struct LNode *next; }LNode,* LinkList; //单链表存储结构 void CreateList(LinkList &L,int n){ LinkList s,r; int i,m; L=(LinkList )malloc(sizeof(LNode)); L->next=NULL; r=L; cout<<"请输入元素:"<<endl; for (i=0;i<n;i++) { //s=(LinkList)malloc(sizeof(LinkList)); 这里有问题 s=(LinkList)malloc(sizeof(LNode)); cin>>m; s->data=m; r->next=s; r=s; } r->next=NULL; } //尾插法创建链表 void MergeList( LinkList &La, LinkList &Lb, LinkList &Lc) { if( !La || !Lb ) //使用之前最好检查一下 { cout <<"Error" <<endl; return; } LinkList pa=La->next; LinkList pb=Lb->next; LinkList pc; Lc=pc=La; while(pa&&pb) { if(pa->data<=pb->data) {pc->next=pa; pc=pa; pa=pa ->next;} else {pc->next=pb; pc=pb; pb=pb->next;} } pc->next=pa?pa:pb; free(Lb); Lb=NULL; } //实现两个有序表的合并 status PrintList(LinkList L) { LinkList p=L->next; LinkList px; LinkList Lx=(LinkList)malloc(sizeof(LNode)); Lx->next=NULL; if(p==NULL) cout<<"链表为空!"<<endl; while(p) { LinkList px=(LinkList)malloc(sizeof(LNode)); px->data=p->data; px->next=Lx->next; Lx->next=px; px=px->next; p=p->next; } //利用头插法倒序存储链表 px=Lx->next; while(px) { cout<<' '<<px->data; px=px->next; } cout<<endl; return ok; } //输出链表 status ClearList(LinkList &L) { if (!L) { cout<<"ERROR"; return 0;} LinkList q; LinkList p=L->next; while(p) { q=p; p=p->next; free(q); } L->next=NULL; return ok; }//清空链表 int main() { LinkList La,Lb,Lc; int x=1,a,b; while(x<=5) { cout<<"(1)创建单链表La并按递增顺序赋值"<<endl; cout<<"(2)创建单链表Lb并按递增顺序赋值"<<endl; cout<<"(3)将La和Lb按原来顺序合并到Lc中"<<endl; cout<<"(4)输出链表Lc"<<endl; cout<<"(5)清空链表Lc"<<endl; cout<<"(6)退出"<<endl; cout<<"请输入选项"<<endl; cin>>x; switch(x) { case 1: cout<<"请输入元素个数:"<<endl; cin>>a; CreateList(La,a); break; case 2: cout<<"请输入元素个数:"<<endl; cin>>b; CreateList(Lb,b); break; case 3:MergeList(La,Lb,Lc); break; case 4:PrintList(Lc); break; case 5:ClearList(Lc); break; } }//while return ok; }