链表中出现的一个小问题。。

陌路流離 2011-10-12 09:20:16
先看下面一段代码。

#include<iostream>
using namespace std;

typedef char datatype; //结点数据类型

typedef struct node * pointer; //结点指针类型

struct node //结点结构
{
datatype data;
pointer next;
};
typedef pointer lklist; //单链表类型 头指针类型


//初始化
lklist initlist()
{
lklist head;
head=new node;
head->next=NULL;
return head;
}

//尾插法建表
lklist t_creat()
{
lklist head;
pointer rear,s;
char ch;
head=new node;
rear=head; //尾指针赋值为头指针的地址
cout<<"输入一个字符,以 # 结束:";
cin>>ch;
while(ch!='#')
{
cout<<"输入一个字符,以 # 结束:";
s=new node; //创建一个新结点
s->data=ch;
if(head==NULL)head=s;
else rear->next=s; //非表空的时候,新结点*s插入到尾节点之后
rear=s; //尾指针rear指向新的表尾
cin>>ch;
}
if(rear!=NULL)
rear->next=NULL;
return head;
}

//头插法建表
lklist h_creat()
{
lklist head;
pointer s;
char ch;
head=new node; //生成新结点
cout<<"输入一个字符,以 # 结束:";
cin>>ch;
while(ch!='#')
{
cout<<"输入一个字符,以 # 结束:";
s = new node;
s->data = ch;
s->next = head->next; //新结点插入到头结点后
head->next = s;
cin>>ch;
}
return head;
}

//求表长
int length(lklist head)
{
int nIndex;
pointer p;
nIndex=0; //计数器
p=head->next; //从首节点开始搜索
while(p!=NULL)
{
nIndex++;
p=p->next; //到下一个结点
}
return nIndex;
}

//按序号查找 查找第i个
pointer Get(lklist head,int i)
{
int j;
pointer p;
if(i < 0)
return NULL; //非法插入位置
j = -1; //计数器
p = head;
while(p!= NULL)
{
j++;
if(j==i)break;
p = p->next; //没有搜索到第 i 结点
}
return p;
}

//按值(x) 查找 (定位)
int locate(lklist head,datatype x)
{
int j;
pointer p;
j = 0; //计数器
p=head->next; //从首节点开始搜索
while(p!=NULL)
{
j++;
if(p->data==x)
break;
p=p->next; //到下一结点
}
if(p->data==x)
return j; //找到了x
else return -1; //没有找到 x
}

//插入
int insert(lklist head,datatype x,int i)
{
pointer p,s;
p = Get(head,i-1); //找到第 i 个结点
if(p==NULL)
{cout<<"插入错误!!\n";return 0;}
s = new node; //生成新结点
s->data = x;
s->next = p->next; //新结点的后继是院第 i 个结点
p->next = s; //原 i-1 个结点的后继是新结点
return 1;
}

//删除
int Delete(lklist head,int i)
{
pointer p,q;
q=Get(head,i-1);
if(q==NULL||q->next==NULL)
{cout<<"删除失败!!\n";return 0;}
p = q->next; //保存待删结点,释放空间
q->next = p->next;
delete p;
return 1;
}

//销毁
void destory(lklist &LK)
{
pointer p,q;
p = LK->next;
while(p!=NULL)
{
q = p->next;
delete p; //删除节点
p = q;
}
LK = NULL;
}

//显示链表内容
void display(lklist head)
{
if(head==NULL)
{
cout<<"链表不存在!"<<endl;
return ;
}
pointer p;
p = head->next;
cout<<"链表中的元素依次是:";
while(p != NULL)
{
cout<<p->data<<' ';
p=p->next;
}
cout<<endl;
}

int main()
{
lklist Lk;
cout<<"调用t_creat函数,创建链表:"<<endl;
Lk=t_creat();
display(Lk);


cout<<"调用length函数,链表的长度是:"<<length(Lk)<<endl;

insert(Lk, 'x',3);
cout<<"调用insert函数,在第3个位置插入字符x之后。";
display(Lk);

cout<<"调用Get函数,获取链表的第4个元素得到是:";
pointer p = Get(Lk,4);
cout<<p->data<<endl;

cout<<"调用locate函数,查找链表中的字符d,得到在链表的第"<<locate(Lk,'d')<<"的位置。"<<endl;

Delete(Lk, 2);
cout<<"调用Delete函数,删除第2个位置的字符之后。";
display(Lk);

destory(Lk);
cout<<"调用destory函数,销毁链表后。";
display(Lk);

return 0;
}

这是个正确的代码,能够运行。
我的问题是:为什么当我定义的销毁链表函数的时候不是用 void destory(lklist &LK)
而用 void destory(lklist LK) 的时候在运行时会发生一个错误 ??(编译还能通过,就是运行的时候 会弹出一个对话框说 “0x00401d54”指令引用的 “0xddddddd”内存。该内存不能为“read”)
但是定义使用 引用 的时候就不会有这个问题 ?? 不解中、。。。
...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
陌路流離 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jc_xiao 的回复:]

为什么按你的代码编译能过 运行的时候输完 数字后 回车就有对话框说 “0x00401d54”指令引用的 “0xddddddd”内存。该内存不能为read。。 = = !
[/Quote]
是啊 我就是不懂为什么这样子的····
y85058201 2011-10-13
  • 打赏
  • 举报
回复
测试了一下你的代码,你的错误出在//按序号查找 查找第i个
pointer Get(lklist head,int i)
{
int j;
pointer p;
if(i < 0)
return NULL; //非法插入位置
j = -1; //计数器
p = head;
while(p->next!=NULL)//这里改过了同理那个locate也要这样写
{
j++;
if(j==i)break;
p = p->next; //没有搜索到第 i 结点
}
return p;
}
y85058201 2011-10-13
  • 打赏
  • 举报
回复
新手的话我觉得你应该一点一点测试代码,不要这么大一片..把一些可以精简的先注释起来再编看看有没有报错.
星羽 2011-10-13
  • 打赏
  • 举报
回复
最近链表真多 = =
陌路流離 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 y85058201 的回复:]

测试了一下你的代码,你的错误出在//按序号查找 查找第i个
pointer Get(lklist head,int i)
{
int j;
pointer p;
if(i < 0)
return NULL; //非法插入位置
j = -1; ……
[/Quote]

学习~~ 我觉得我经常会出现这样子的问题 但是又不知道为什么会有这样子的错误
jc_xiao 2011-10-12
  • 打赏
  • 举报
回复
为什么按你的代码编译能过 运行的时候输完 数字后 回车就有对话框说 “0x00401d54”指令引用的 “0xddddddd”内存。该内存不能为read。。 = = !
陌路流離 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jc_xiao 的回复:]

因为 void destory(lklist LK) 的时候,只是相当于对内存分配的 LK 的一个模子起作用,当函数调用结束的时候, 那个系统分配的模子内存就撤销了。也就是说 对LK 本身还是没有起作用的, LK在内存中还是存在。 而用引用 就是对LK 直接有作用了。就是把它销毁了.
[/Quote]
噢噢 , 那为什么 Deete 函数没有使用 引用 做参数 ,也是对的
jc_xiao 2011-10-12
  • 打赏
  • 举报
回复
因为 void destory(lklist LK) 的时候,只是相当于对内存分配的 LK 的一个模子起作用,当函数调用结束的时候, 那个系统分配的模子内存就撤销了。也就是说 对LK 本身还是没有起作用的, LK在内存中还是存在。 而用引用 就是对LK 直接有作用了。就是把它销毁了.

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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