首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

链表清空函数有有关问题但不知道出在哪…运行到第五步出错…求帮助求解释…本人新手…

2012-10-16 
链表清空函数有问题但不知道出在哪…运行到第五步出错……求帮助求解释……本人新手……#include iostream.h#in

链表清空函数有问题但不知道出在哪…运行到第五步出错……求帮助求解释……本人新手……
#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 0typedef 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;} 

热点排行