C中的链接列表

时间:2014-06-28 08:54:40

标签: 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 -> link = *q ;
    *q = temp ;
}

此功能用于在列表的开头添加新项目。

我怀疑的是,在大多数书中,涉及链表的函数函数使用指向节点结构的指针而不是结构本身的实例。

void add( struct node *q, int num )
{
    struct node temp ;

    temp.data = num ;
    temp.link = q ;
    q = &temp ;
}  

是否有理由将第一种形式的功能作为首选,或两种方法同样适用?

2 个答案:

答案 0 :(得分:2)

第二种方法完全错误。它什么都不做。节点在程序进入函数体时创建,在离开函数体时消失,因为它没有动态分配,更改为p不会反映到调用函数传递的指针。

答案 1 :(得分:1)

第二个例子是完全错误的 所以你错了以及这个问题的一个例子 以下示例可能有效。

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

为节点使用指针和动态分配的内存的原因之一是存在时间 如果您创建生存期节点(例如全局变量和静态内存),则可以使用它。

此外,它甚至可以用于struct node temp;等自动变量。它可以在函数内部创建列表时使用,并且是本地的,如下所示:

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