C语言数据结构链表尾插法问题!求解释

Captain_Jack 2012-05-27 09:45:00
老是没有结果,求大牛帮忙解释下原因,实在是没搞懂!到底问题出在哪里?

typedef struct LNode{
ElemType date;
struct LNode *next;
}*LinkList;

//Initial LinkList
void InitL(LinkList &L){
L = (LinkList)malloc(sizeof(LNode));//we just need a RAM directory to told us where the LinkList is.
L->next = NULL;
}

//Create LinkList
void CreateL(LinkList &L){
int len; //Firstly,we need to known the length of the LinkList.
printf("Please input L length:");
scanf("%d", &len);
for(int i = 0 ; i < len; i++){
LinkList p = (LinkList)malloc(sizeof(LNode)); //or LinkList p = new LNode(c++)
if(!p)
printf("Error\n");
printf("Please input LinkList number:");
scanf("%d", &p->date);
//tail insert
L->next = p;
L = p;
}

}
...全文
463 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿七哥 2012-05-30
  • 打赏
  • 举报
回复
楼主,你好,这是我之前编的,希望能对你有用

//////////////////////定义一个节点类型/////////////////////////////////////
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}lnode,*link;
//////////////////////通过尾插法构建一个链表//////////////////////////////////////
link weicha()
{
link l,r,p; //3个相同类型的指针
int x;
printf("请往节点中输入数字\n");
l=(lnode*)malloc(sizeof(lnode*)); //l指针
l->next=NULL; //头结点赋值为空
r=l; //r指针=l指针
scanf("%d",&x); //输入
while(x!=0000)
{
p=(lnode*)malloc(sizeof(lnode*)); //动态分配一个内存空间
p->data=x;
p->next=r->next;
r->next=p; //在尾部插入新节点
r=p; //指向新的尾节点
scanf("%d",&x);
}
return l;
}
//////////////////////////////////////////////////////////////
void print(link l) //输出
{
link p;
p=l->next; //这个类型的p指向l链表的头结点
while(p!=NULL)
{
printf("%3d",p->data); //输出
p=p->next;
}
printf("\n");
}
/////////////////////////////////////////////////////////////////////
void main()
{
link l;
l=weicha(); print(l);
}
//////////////////////////////////////////////////////////////////////
angel_su 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
...
2.我自己将InitL(LinkList &L)改成了InitL(LinkList L)之后,原来的代码就可以运行了...[/Quote]
这样会宕掉才是,你用空头节点,初始和销毁函数用&L参数,其它函数不会改变链表头就设计L当参数即可。另外,CreateL函数同InitL一样,最后节要L->next = NULL;
Captain_Jack 2012-05-28
  • 打赏
  • 举报
回复
嗯,谢谢。我觉得自己不理解的地方就是&L和L的区别。能具体说下吗?
而且我发现,InitL(LinkList &L)这样的函数,我用头插法可以运行出结果。但是用尾插法就不行,尾插法只能将&L改成L.为什么?
只希望自己能彻底搞懂,求指导![Quote=引用 5 楼 的回复:]

引用参数以&开头,除可供输入值外,还将返回操作结果。你是按照书上课本打的吧。我想告诉你那是算法。不一定代码就是它。你要变成代码需要改动。如果你已经定义了L为指针。那你为什么还要加&。你画蛇添足啊?
我也不是很懂。
[/Quote]
shaocheng9 2012-05-28
  • 打赏
  • 举报
回复
LinkList r=L;


r->next = p;
r = p;
p->next=NULL;
Captain_Jack 2012-05-28
  • 打赏
  • 举报
回复
不用写后面代码了,只要你自己写个测试主函数就行了,主要是看创建链表的时候头插和尾插的却别[Quote=引用 9 楼 的回复:]

你能把你后面代码写出来吗?
[/Quote]
shaocheng9 2012-05-28
  • 打赏
  • 举报
回复
定义r=L,为了保持L头指针特性。我也菜鸟,说多了怕误导你,嘿嘿。
菜鸟新手 2012-05-28
  • 打赏
  • 举报
回复
引用参数以&开头,除可供输入值外,还将返回操作结果。你是按照书上课本打的吧。我想告诉你那是算法。不一定代码就是它。你要变成代码需要改动。如果你已经定义了L为指针。那你为什么还要加&。你画蛇添足啊?
我也不是很懂。
菜鸟新手 2012-05-28
  • 打赏
  • 举报
回复
你能把你后面代码写出来吗?
Captain_Jack 2012-05-28
  • 打赏
  • 举报
回复
嗯,运行结果对了!
1.想请问下为什么要LinkList r=L;这样用,而不是直接就用L。是因为我在函数InitL(LinkList &L)里面的L是个引用类型吗?
2.我自己将InitL(LinkList &L)改成了InitL(LinkList L)之后,原来的代码就可以运行了,请问&L和L的内在具体区别在哪里?希望给个详细解释。
本人菜鸟,很多不会,万分感谢你的指导啊!
[Quote=引用 3 楼 的回复:]

LinkList r=L;


r->next = p;
r = p;
p->next=NULL;
[/Quote]
天台的故事 2012-05-28
  • 打赏
  • 举报
回复
LinkList p = (LinkList)malloc(sizeof(LNode)); //or LinkList p = new LNode(c++)
改成
LinkList *p = (LinkList*)malloc(sizeof(LNode));
Captain_Jack 2012-05-27
  • 打赏
  • 举报
回复
额,*LinkList已经是指针类型的了!改成*p就会报错啊。能讲下尾插法具体的注意事项吗?感觉核心代码没有错错,但是就是没有结果。[Quote=引用 1 楼 的回复:]

LinkList p = (LinkList)malloc(sizeof(LNode)); //or LinkList p = new LNode(c++)
改成
LinkList *p = (LinkList*)malloc(sizeof(LNode));

试试,下次把代码贴全啊,不然没法给你调试的
[/Quote]
lkxd2011 2012-05-27
  • 打赏
  • 举报
回复
LinkList p = (LinkList)malloc(sizeof(LNode)); //or LinkList p = new LNode(c++)
改成
LinkList *p = (LinkList*)malloc(sizeof(LNode));

试试,下次把代码贴全啊,不然没法给你调试的

70,011

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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