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;
}