乘风 发表于 2012-8-5 19:10:13

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

本帖最后由 乘风 于 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));这一句出错。但是这和书中给出的参考代码方式完全一样啊。为什么就不行呢。而且,我自己分析也觉得这种方式应该不会出错啊。求指点,我真是郁闷很久了。。大家只帮我看这一处就可以的,别的地方就不麻烦了。谢谢


万骨空 发表于 2012-8-5 20:18:26

L是一个指向指针的指针,你没有给L赋值,即没有说L是指向哪个指针,然后你给L指向的地址(随机)赋值就会出现错误。

万骨空 发表于 2012-8-5 20:23:44

向一个未赋值的指针指向的地址赋值是非常危险地。希望楼主不要再犯这样的错误。

蓝色旋律 发表于 2012-8-16 09:31:04

(*L)=(LNode *)malloc(sizeof(LNode));
用一级指针接一级指针,能接到吗?你将形参改成二级指针。
还有你malloc的时候强制转为struct LNode *或者是Linklist

乘风 发表于 2012-8-16 20:36:07

经过用typedef struct LNode 将struct LNode 定义成LNode形了,所以直接强制转换为LNode *也是可以的。另外刚刚受你启发,我已经想明白了,我的实参和形参都用的二级指针,而实际上我需要传递滴的是一级指针的地址,所以全局变量Linklist *a1,改为Linklist a1;然后实参改为CreatLinklist(&a1,n);然后就没有错误了。

乘风 发表于 2012-8-16 20:36:44

蓝色旋律 发表于 2012-8-16 09:31 static/image/common/back.gif
(*L)=(LNode *)malloc(sizeof(LNode));
用一级指针接一级指针,能接到吗?你将形参改成二级指针。
还有你 ...

经过用typedef struct LNode 将struct LNode 定义成LNode形了,所以直接强制转换为LNode *也是可以的。另外刚刚受你启发,我已经想明白了,我的实参和形参都用的二级指针,而实际上我需要传递滴的是一级指针的地址,所以全局变量Linklist *a1,改为Linklist a1;然后实参改为CreatLinklist(&a1,n);然后就没有错误了。
页: [1]
查看完整版本: 构造一个链表,编译通过,但是运行出错,求解释