链表初始化问题

yshf0325 2011-12-05 12:05:43
#include "stdio.h"
#include "malloc.h"
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node *next;
}LinkList;
void InitList(LinkList *L)//初始化单链表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
void main()
{
int i;
ElemType e;
LinkList *L;
InitList(L);
}
#include "stdio.h"
#include "malloc.h"
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node *next;
}LinkList;
void InitList(LinkList *L)//初始化单链表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
void main()
{
int i;
ElemType e;
LinkList *L;
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
为什么第一个源程序中调用链表初始化函数会出错,而第二个源程序中不调用函数,直接把函数里的代码写在主函数中就可以正常运行?
...全文
792 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
brenda0523_11 2012-08-09
  • 打赏
  • 举报
回复
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status ;
typedef int ElemType ;

typedef struct Node
{
ElemType data ;
struct Node *next ;
}Node, *LinkList;

//=========初始化顺序链表=============
Status InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(Node)); //产生头节点,并使L指向此头节点
if(!(*L))
return ERROR ; //内在分配失败
(*L)->next = NULL ;

return OK ;
}
这种写法应该也可以吧?
无限生机 2011-12-05
  • 打赏
  • 举报
回复
void InitList(LinkList *L)//初始化单链表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}


改为:
void InitList(LinkList **L)//初始化单链表
{
*L=(LinkList *)malloc(sizeof(LinkList));
(*L)->next=NULL;
}



在main的调用中改为InitList(&L),其他的不变.
自信男孩 2011-12-05
  • 打赏
  • 举报
回复
void InitList(LinkList **L)//初始化单链表
{
*L = NULL;
}
其实这个问题就像,void swap();函数那样,传指针可以实现两个数据的交换,而传数据不可以实现两个数据的交换。传地址是穿的源数据的地址,修改的是源数据;传数据,实际上是传的源数据的副本,修改是源数据的副本,副本是在栈上申请的,函数执行结束后会自动释放,没有返回到调用函数。
你可以使用struct LinkList *InitList(LinkList *L) {...;return L;}然后把你的返回值返回到调用函数。
但是我建议你还是使用我上面的链表的初始方法,你对节点的空间申请都放在创建链表函数内。初始化就是只管初始化。
zebiak123 2011-12-05
  • 打赏
  • 举报
回复
我去,帖子发出来都这么多人回了
zebiak123 2011-12-05
  • 打赏
  • 举报
回复
正确方法如下:
#include "stdio.h"
#include "malloc.h"
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node *next;
}LinkList;
void InitList(LinkList **L)//初始化单链表
{
*L=(LinkList *)malloc(sizeof(LinkList*));
(*L)->next=NULL;
}
void main()
{
int i;
ElemType e;
LinkList *L;
InitList(&L);
L->data = 'A';
printf("linkdata = %c\n",L->data);
}
  • 打赏
  • 举报
回复
给void InitList(LinkList *L)传参只是值传递.函数退出后L将被系统回收

可以这样改:

void InitList(LinkList **L)//初始化单链表
{
*L =(LinkList *)malloc(sizeof(LinkList));
(*L)->next=NULL;
}

或者
LinkList *InitList(LinList *L)
{
L =(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
return L;
}
21011111111 2011-12-05
  • 打赏
  • 举报
回复
你在函数里分配内存必须要用指针的指针,只用一个指针的话,是不行的。

编译器要给函数的每一个参数做一个副本,当你修改指针指向的内存空间的值的时候,他能够返回正确的结果,因为指针的副本还是内存地址,当你在函数中分配内存的时候,它做的是把副本的指针指向了新的内存空间了,但原指针是得不到这块内存的。

参考林锐的 《C/C++高质量编程》相关章节
ningto.com 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yshf0325 的回复:]

引用 2 楼 hnuqinhuan 的回复:
我喜欢
void InitList(LinkList *&L)//初始化单链表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
这样使用

这种写法都不能编译!怎么回事?
[/Quote]

这种是C++里的写法, C编译不过
lancerEx 2011-12-05
  • 打赏
  • 举报
回复

对比下下面两段代码
LinkList *L;
void InitList(LinkList *L)
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}


int l;
void InitInt(int l)
{
l = 5;
} //这个应该知道吧

打个比方吧
LinkList *L;
&L = 0x101
此时L的值未知
如图
0x100+---+
| |
0x101+---+
| ? | --> L &L = 0x101,L的值未知
0x102+---+
| |
0x103+---+
| |
0x104+---+

InitList(L); 只是把L的值(?)传进去,并没有把L的地址(0x101)传进去

0x200+---+
| |
0x201+---+
| ? | --> l &l = 0x201,l的值未知
0x202+---+
| |
0x203+---+
| |
0x204+---+
InitInt(l); // 只传递了l的值(?),并没有传地址(0x201)

两者是不是很相似呢

所以应该怎么改 你懂的
yshf0325 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hnuqinhuan 的回复:]
我喜欢
void InitList(LinkList *&L)//初始化单链表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
这样使用
[/Quote]
这种写法都不能编译!怎么回事?
無_1024 2011-12-05
  • 打赏
  • 举报
回复
我喜欢
void InitList(LinkList *&L)//初始化单链表
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
这样使用


69,368

社区成员

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

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