鱼C论坛

 找回密码
 立即注册
查看: 4020|回复: 5

构造一个链表,编译通过,但是运行出错,求解释

[复制链接]
发表于 2012-8-5 19:10:13 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 乘风 于 2012-8-16 20:37 编辑

看得书是《数据结构(c语言版)》,中国水利水电出版社 ,赵坚。
这本书真是恶心,所有的算法都只给出分C语言的描述,从来不给个完整源码验证一下。
而且给出的部分也是各种垃圾(也许是我自己太垃圾)。

书中定义结构体:
typedef struct LNode
{
       ElemType data;
       struct LNode *next;
}LNode,*Linklist;
LNode *head;

给出的初始化链表的代码:
void initlist(LinkList *L)
{
     *L=(LNode *)malloc(sizeof(LNode));
     (*L)->next=NULL;
}

下面是我自己的程序:
#include "stdafx.h"
#include <stdio.h>
#include <MALLOC.H>

typedef struct LNode{
int data;
LNode *next;
}LNode, *Linklist;

Linklist *a1;

void CreatLinklist(Linklist *L, int n)
{
LNode *p;
(*L)=(LNode *)malloc(sizeof(LNode));
(*L)->next=NULL; //链表初始化
p=(*L);

int num;
int pos=0;
LNode *s;
printf("输入一组数,大余10个,以0作为结束标志:\n");
//scanf("%d", &num);
while (num!=0&&pos<n)
{
scanf("%d", &num);
pos++;
s=(LNode *)malloc(sizeof(LNode));
s->data=num;
s->next=p->next;
p->next=s;

}
}

void DisplayLinklist(Linklist *L)
{
LNode *p;
p=(*L)->next;
int num=0;
while (p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}

int main(int argc, char* argv[])
{
//Linklist a1;
int n;
printf("请输入链表元素的个数\n");
scanf("%d", &n);
CreatLinklist(a1,n);
// DisplayLinklist(a1);
return 0;
}
我调试过了,程序执行到CreatLinklist()函数中的(*L)=(LNode *)malloc(sizeof(LNode));这一句出错。但是这和书中给出的参考代码方式完全一样啊。为什么就不行呢。而且,我自己分析也觉得这种方式应该不会出错啊。求指点,我真是郁闷很久了。。大家只帮我看这一处就可以的,别的地方就不麻烦了。谢谢


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-5 20:18:26 | 显示全部楼层
L是一个指向指针的指针,你没有给L赋值,即没有说L是指向哪个指针,然后你给L指向的地址(随机)赋值就会出现错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-5 20:23:44 | 显示全部楼层
向一个未赋值的指针指向的地址赋值是非常危险地。希望楼主不要再犯这样的错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-16 09:31:04 | 显示全部楼层
(*L)=(LNode *)malloc(sizeof(LNode));
用一级指针接一级指针,能接到吗?你将形参改成二级指针。
还有你malloc的时候强制转为struct LNode *或者是Linklist
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-16 20:36:07 | 显示全部楼层
经过用typedef struct LNode 将struct LNode 定义成LNode形了,所以直接强制转换为LNode *也是可以的。另外刚刚受你启发,我已经想明白了,我的实参和形参都用的二级指针,而实际上我需要传递滴的是一级指针的地址,所以全局变量Linklist *a1,改为Linklist a1;然后实参改为CreatLinklist(&a1,n);然后就没有错误了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-16 20:36:44 | 显示全部楼层

经过用typedef struct LNode 将struct LNode 定义成LNode形了,所以直接强制转换为LNode *也是可以的。另外刚刚受你启发,我已经想明白了,我的实参和形参都用的二级指针,而实际上我需要传递滴的是一级指针的地址,所以全局变量Linklist *a1,改为Linklist a1;然后实参改为CreatLinklist(&a1,n);然后就没有错误了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 17:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表