主题:我们西电软院的作业! 链表的,牛人来啊!
Chopin
[专家分:0] 发布于 2010-03-20 20:58:00
本人小白,这是我写的,请高手看看我哪些地方不对,不用你重写个啦,谢谢!! 目的:建立一个链表,然后再输出这些链表结点里的元素值
问题:输入好元素值后,输出有问题,一是输出的值很奇怪,二是程序崩溃
希望高人指点 谢谢!
#include <stdio.h>
#include <malloc.h>
#define N 3 //假设建立3个结点的链表
typedef struct LNode{ //线性表 LNode
int data;
struct LNode *next;
}LNode;
CreatLNode(LNode *L,int n) //逆序建立带头结点的链表
{
LNode *p;
int i;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
for(i=n;i>0;--i)
{
p=(LNode*)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}
int main()
{
LNode L;
LNode *p;
int i,;
CreatLNode(&L,N);
p=&L; //错误 估计就在这些地方
for(i=0;i<N;++i) //然后把刚建立的链表里的元素值输出
{
printf("%d",p->data);
p=p->next;
}
system("PAUSE");
return 0;
}
回复列表 (共30个回复)
沙发
ccpp [专家分:9360] 发布于 2010-03-20 21:05:00
用VC++吗, 单步调试程序,很容易找到。
板凳
Chopin [专家分:0] 发布于 2010-03-20 21:07:00
我用的我是Dev啊。
3 楼
ccpp [专家分:9360] 发布于 2010-03-20 22:16:00
基于你的代码,随便改改吧
建议用编译器的调试功能,这样的问题几下就调出来了
------------
这两行不要了,因为L已经被分配了空间。
// L=(LNode*)malloc(sizeof(LNode));
// L->next=NULL;
int _tmain(int argc, _TCHAR* argv[])
{
LNode L;
4 楼
cxxcomp [专家分:2370] 发布于 2010-03-20 22:20:00
你错的何止这一个地方。
[code=c]
#include <stdio.h>
#include <malloc.h>
#define N 3 //假设建立3个结点的链表
typedef struct tagNode{ //线性表 LNode
int data;
struct tagNode *next;
}LNode,* PNODE;
void CreatLNode(PNODE& head,int n) //逆序建立带头结点的链表
{
PNODE rear, q;
head = rear = (LNode*)malloc(sizeof(LNode));
for (int ix = 0; ix < n; ++ix)
{
q = (PNODE)malloc(sizeof(LNode));
scanf("%d", &q->data);
rear->next = q;
rear = q;
}
rear->next = NULL;
}
int main()
{
PNODE L;
PNODE p;
CreatLNode(L, N);
p = L; //错误 估计就在这些地方 何止这一个地方。
while (p->next != NULL)
{
p = p->next;
printf("%d", p->data);
}
return 0;
}
[/code]
5 楼
cxxcomp [专家分:2370] 发布于 2010-03-20 22:37:00
另外,既然malloc,你还得考虑free。代码就不写了。还有下次问问题的时候麻烦把后面的四个字去掉,看着不舒服。理你也不是,不理你也不是。简单明了写明问题就行了。OK?
6 楼
Chopin [专家分:0] 发布于 2010-03-20 22:47:00
楼上的,你是用C++写的啊
大概能看懂,但你能告诉我的错误主要在哪吗? 是不是传值不对?能说的详细些吗?谢谢!
7 楼
雪光风剑 [专家分:27190] 发布于 2010-03-20 22:54:00
你传乱了……逆序建立链表的话你传递指针作为形参的话函数结束时候链表会停在尾巴上而不是你期望的头上
另外你为什么要在主函数里去声明一个普通结点类型和一个指针类型呢?申请一个指针类型做你想做的事足够了。
cxxcomp的代码是如假包换的C,只不过混合了一点点c++的语法习惯而已
8 楼
Chopin [专家分:0] 发布于 2010-03-20 23:11:00
楼上的 可是我在函数里的那个L是头结点,它没有指向尾巴吧,而是指向p的。并且p也没指向尾巴啊。
主函数里的那个L是头结点,不行吗?我看书上是这样写的...
9 楼
cxxcomp [专家分:2370] 发布于 2010-03-20 23:20:00
楼上的,你是用C++写的啊
大概能看懂,但你能告诉我的错误主要在哪吗? 是不是传值不对?能说的详细些吗?谢谢!
西特!我真的不明白了,别嫌我说话不好听,没别的意思,你都是西电软院的,好似这样的话不该说出来。参数里有个& 就是C++, 有这个* 就是C???!!! 你权当我什么都没写,什么都没说。代码你不要看了。后面的话,我不想说了。
10 楼
quhailiang1984 [专家分:1720] 发布于 2010-03-20 23:30:00
做这样的链表时候一定要设置一个头结点head,这样才不至于遍历完整个链表时找不到头结点在哪里!
我来回复