首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中的链接列表

C中的链接列表
EN

Stack Overflow用户
提问于 2014-06-28 08:54:39
回答 2查看 133关注 0票数 2
代码语言:javascript
复制
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 ;
}

此函数用于在列表开头添加一个新项。

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

代码语言:javascript
复制
void add( struct node *q, int num )
{
    struct node temp ;

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

是否有理由选择第一种形式的函数,还是这两种方法都一样好?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-28 09:01:02

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

票数 2
EN

Stack Overflow用户

发布于 2014-06-28 09:45:57

第二个例子是完全错误的。

所以你错了,也是这个问题的一个例子。

下面的示例可能有效。

代码语言:javascript
复制
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;。当在函数中创建列表并对其本地时,可以使用它,如下所示:

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24465226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档