C语言链表初始化。下面这样不可以吗

void init_list(linklist *l)
{
l=(linklist *)malloc(sizeof(linklist));
l->next=NULL;
}

头结点初始化有两种方法:一个是返回指针地址,另一个是传址

方法一:返回指针(创建链表中,这种方法比较常用)
linklist *init_list(linklist *l)//这里是指针函数,带参数
{
l = (linklist *) malloc (sizeof(linklist));
l->next=NULL;
return I;//要加上这句返回指针
}

主函数调用形式为 linklist *head = init_list(head);

linklist *init_list()//这里是指针函数,不带参数
{
linklist *l = (linklist *) malloc (sizeof(linklist));
l->next=NULL;
return I;//要加上这句返回指针
}

主函数调用形式 linklist *head = init_list();

方法二:利用二级指针传址

void init_list(linklist **l)//注意现在不是指针函数(很少用)
{
*l = (linklist *) malloc (sizeof(linklist));
*l->next=NULL;
}

主函数调用形式为 linklist *head = NULL;
init_list(&head);//传址

还有另外一种比较常见的传址形式

void init_list(linklist *I)//这里不是指针函数
{
I->next = NULL;
}

主函数调用形式为 linklist head;
init_list(&head);//传址

楼主一定想问为什么这样吧,我只能说你先把这些方法有所了解,掌握好其中一种用法,以后的学习中看到相关书籍,自然会慢慢理解(PS:这东西也不是一下子就能全掌握的,是需要慢慢积累和应用)追问

都是高手啊!厉害。我都不知道要拿谁当成最佳答案了

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-10-06
因为函数是不改变实参的值的,因此尽管函数体内变量l的确已经分配好内存,但是由于实参的值并不改变,所以实参仍旧未分配内存。
比如说:
linklist *p;
initlist(p);
定义时p是悬垂的,因为它未初始化,指向未知的地方,当调用函数后,形参l复制了p的值,然后你的函数让l指向该新分配的内存,但是实参p仍旧未分配。函数结束之后,你分配给l的内存也找不到了,因为l在函数调用后被销毁,导致了内存泄漏。
希望我的回答能帮你解决疑惑。追问

谢谢,那要怎样做才能让它分配到内存呢?

追答

只要修改一点点就行了:
linklist * init_list()
{
linklist * l=(linklist *)malloc(sizeof(linklist));
l->next=NULL;
}
调用时就这样:
linklist *p = init_list();

追问

少了一个return l;吧

追答

对,不好意思,之前没注意到,谢谢你的指正!

第2个回答  2011-10-06
不可以!
若参数改为*&l则可以.
不明白原因可以继续追问哈!追问

还真不明白,可以加高手你的QQ号吗

追答

俺不是高手,大家相互学习哈!401869587.
不过现在去吃饭去了!

C语言链表初始化。下面这样不可以吗
头结点初始化有两种方法:一个是返回指针地址,另一个是传址 方法一:返回指针(创建链表中,这种方法比较常用)linklist *init_list(linklist *l)\/\/这里是指针函数,带参数 { l = (linklist *) malloc (sizeof(linklist));l->next=NULL;return I;\/\/要加上这句返回指针 } 主函数调用形式为...

C语言数据结构单链表初始化
你说的那个是逆序建立n个节点的链表,建完头结点后由于链表中没有其他节点就把头结点的next置为空,这一点如果不明白的话去看链表那一章,有介绍!!!之后从后往前建立链表!!刚开始是L->next =NULL 要注意p是每次新建的节点,这样从后往前以此建立链表,只要明白p是每次新建的节点,和从后往前...

怎么用C语言初始化一个链表啊~
所谓初始化链表就是把链表的数据置空,也就是所有的数据,指针都为null 举个单链表的例子 该算法的结果将单链表head置为空表,只需要将头节点的指针置为null即可。算法实现如下 void setnull(struct Lnode *head){ head->next=NULL;} 双链表和循环链表依次类推·

C语言结构指针要如何初始化,特别是做一个链表的时候
问题是在*a的里面(其中的b没有定义,不能使用)struct people{ ... }*a,*b,*c;这样定义,或者是下面这样:struct people *a,*b,*c;*a={ ...};*b={ ...};*c={ ...};

数据结构c语言初始化单链表的头结点 为什么这么写不对 求高手解答...
你的显然是有问题的。引用传递与非引用传递是不同的。你百度下引用传值,就会明白。按你的写法,在函数调用时,会在init函数中生成一个临时的变量L,而不是main里面的L,你分配的空间也是给临时的变量L分配,而不是main里面的L。 引用的话,则只有一个L,所以可以。一个很经典的小例子,void swap(...

大侠们怎么用C语言实现初始化一个链表啊~~~
单链表:include<stdio.h> include<stdlib.h> typedef struct LNode { char data;struct LNode *next;}LNode,*LinkList;void InitList(LinkList *L) \/\/初始化 { L = (LinkList)malloc(sizeof(LNode));(*L)->next = NULL;} char GetElem(LinkList L,int i) \/\/返回i 位置的元素 { ...

关于C语言数据结构单链表初始化的问题
} void main(){ x=1; y=2;fun(x, y);...\/\/此时仍然x=1; y=2;} 但是,函数写成如下形式 void InitList(LinkList *head);可以实现引用传递参数的功能。在需要函数内部修改链表头指针时,用该形式可以解决该问题。而void InitList(LinkList head) 不可以在函数内部修改链表头指针。

c语言单链表初始化问题
这里q是什么,q是形参,你无论怎么变q,出了函数传进来的值还是不变。假如Node是一个int,你传入一个int* q,你要改变q是不是用*q=0;一样的,在这个例子里,我会传入一个Node** q ,然后所有q改成*q 来实现。表达能力不行,反正就那意思吧。应该没错,嗯。

c语言单链表初始化后输出为啥是逆序的呀?
因为头指针指向的当前节点的NEXT指向新节点,然后直接将头节点指向新节点了,所以它是逆序的。

高分求大神帮助c语言链表初始化
你好,可以在fclose(fp);之后加上 p=l->next;while(p!=NULL){ printf("%s%c",p->name,'\\n');printf("%s%c",p->sex,'\\n');printf("%s%c",p->tel,'\\n');printf("%s%c",p->addr,'\\n');printf("%s%c",p->e_mail,'\\n');printf("%s%c",p->qq,'\\n');printf("...

相似回答