C语言中的链表
此函数用于在列表开头添加新项 我怀疑的是,在大多数书籍中,涉及链表的函数都使用指向节点结构的指针,而不是结构本身的实例C语言中的链表,c,linked-list,C,Linked List,此函数用于在列表开头添加新项 我怀疑的是,在大多数书籍中,涉及链表的函数都使用指向节点结构的指针,而不是结构本身的实例 void add ( struct node **q, int num ) { struct node *temp ; /* add new node */ temp = ( struct node * ) malloc ( sizeof ( struct node ) ) ; temp -> data = num ; temp
void add ( struct node **q, int num )
{
struct node *temp ;
/* add new node */
temp = ( struct node * ) malloc ( sizeof ( struct node ) ) ;
temp -> data = num ;
temp -> link = *q ;
*q = temp ;
}
是否有理由首选函数的第一种形式,或者两种方法都一样好 第二种方法是完全错误的。它什么也不做。节点是在程序进入函数体时创建的,在离开函数体时消失,因为它不是动态分配的,更改为
p
不会反映到调用函数中传递的指针。第二个示例完全错误。因此,你是错的,也是这个问题的一个例子。
下面的示例可能有效
void add( struct node *q, int num )
{
struct node temp ;
temp.data = num ;
temp.link = q ;
q = &temp ;
}
为节点使用指针和动态分配内存的原因之一是存在时间。如果创建一个生存期节点,例如全局变量和静态内存,则可以使用它 此外,它甚至可以用于自动变量,如
struct node temp代码>。当列表是在函数内部创建的并且是函数的本地列表时,可以使用它,如下所示:
void add( struct node **q, int num){
static int count = 0;
static struct node pool[1024];
if(count == 1024){
fprintf(stderr, "Sold out!\n");
} else {
pool[count].data = num;
pool[count].link = *q;
*q = &pool[count];
++count;
}
}
#包括
结构节点{
int数据;
结构节点*链接;
};
void add(结构节点*q,int num){
如果(num==10){
对于(;q;q=q->link)
printf(“%d”,q->data);
printf(“\n”);
}否则{
结构节点温度;
温度数据=num;
温度链接=q;
添加(&temp,num+1);
}
}
int main(){
add(NULL,0);
返回0;
}
首选第一种方法,因为第二种方法没有任何效果。第二种形式没有任何作用-赋值到q
只更改局部变量q
指向的内容,而不影响调用者。此外,temp
的存储在add
退出后无效,因此您可能无法保留对它的引用。此外,建议不要强制转换malloc的返回。看这个哈克斯,谢谢你的好意。
#include <stdio.h>
struct node {
int data;
struct node *link;
};
void add( struct node *q, int num){
if(num == 10){
for( ; q ; q = q->link)
printf("%d ", q->data);
printf("\n");
} else {
struct node temp;
temp.data = num;
temp.link = q;
add(&temp, num + 1);
}
}
int main(){
add(NULL, 0);
return 0;
}