鱼C论坛

 找回密码
 立即注册
查看: 3515|回复: 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;
}

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

  4. typedef struct LNode{
  5. int data;
  6. LNode *next;
  7. }LNode, *Linklist;

  8. Linklist *a1;

  9. void CreatLinklist(Linklist *L, int n)
  10. {
  11. LNode *p;
  12. (*L)=(LNode *)malloc(sizeof(LNode));
  13. (*L)->next=NULL; //链表初始化
  14. p=(*L);

  15. int num;
  16. int pos=0;
  17. LNode *s;
  18. printf("输入一组数,大余10个,以0作为结束标志:\n");
  19. //scanf("%d", &num);
  20. while (num!=0&&pos<n)
  21. {
  22. scanf("%d", &num);
  23. pos++;
  24. s=(LNode *)malloc(sizeof(LNode));
  25. s->data=num;
  26. s->next=p->next;
  27. p->next=s;

  28. }
  29. }

  30. void DisplayLinklist(Linklist *L)
  31. {
  32. LNode *p;
  33. p=(*L)->next;
  34. int num=0;
  35. while (p!=NULL)
  36. {
  37. printf("%d ",p->data);
  38. p=p->next;
  39. }
  40. }

  41. int main(int argc, char* argv[])
  42. {
  43. //Linklist a1;
  44. int n;
  45. printf("请输入链表元素的个数\n");
  46. scanf("%d", &n);
  47. CreatLinklist(a1,n);
  48. // DisplayLinklist(a1);
  49. return 0;
  50. }
复制代码
我调试过了,程序执行到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-4-25 18:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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