c - C编程中的修改链表

标签 c linked-list

所以我有一个链表,当我向它添加新节点时,我试图使链表反向。所以我的链表包含两条数据和一个指向下一个对象的指针。当我添加一个新节点时,我希望该节点指向当前链表。我试过这样做,以便将当前列表的下一个指针指向当前链表,然后更改当前链表中的数据,但我无法让它工作。

下面是我的代码和我尝试过的。它只是给我一个指向自身的循环链表。

struct Node {
    void *data;
    int value;
    struct Node *next;
};   

struct Node *list;

void create() {
    list = malloc(sizeof(struct Node));
}

void add(*data, int value){
    if (list->value != 0){
        list->next = list;
    }

    list->data = mem_address /* memory address of some item */;
    list->value = value;
}

所以第一个节点被正确添加了,但是一旦我添加了第二个节点,它就只是一个链表,其 next 的值指向它自己,本质上是一个循环链表。请有人帮助我。

这里有一个例子让它更清楚一些。

create();
add(pointer, 12);
add(pointer2, 22);

所以它看起来像这样;

+-------+----------------+
| Data  | 0x7fecfbd4103c |
+-------+----------------+
| value |      22        |
+-------+----------------+
| next  |                |
+-------+----------------+

+-------+----------------+
| Data  | 0x7fdb9904a03c |
+-------+----------------+
| value |      12        |
+-------+----------------+
| next  |     NULL       |
+-------+----------------+

最佳答案

我想你想要更像这样的东西:

struct Node {
    void *data;
    int value;
    struct Node *next;
};   

struct Node *list=NULL; 

void create(){
   // list = malloc(sizeof(struct Node)); 

   //Does nothing. Not required.
}

void add(void *data, int value){
    struct Node *node = malloc(sizeof(struct Node));
    node->data=data;
    node->value=value;
    node->next=list;
    list=node;
}

void destroy(){
    while(list!=NULL){
        struct Node* next=list->next;
        free(list);
        list=next;
    }
}

列表初始化为空。所以你不需要你的 create() 函数。 但是您应该在处理完列表后调用 destroy()。 如果那是在程序的末尾,你真的不需要调用它——环境会回收内存。然而,这是一种很好的做法。

关于c - C编程中的修改链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28523774/

相关文章:

c - strtok() 作为 printf() 中的参数反向打印值

c - 如何使用多个分隔符分割输入?

java - 双向链表

c - 为什么删除节点中的位置 0 不起作用?

java链表问题

java - Hackerearth 删除好友 : Runtime Error - NZEC

c - Mac OS/X 上的 C 程序如何得知用户双击打开了关联的文件?

C(基本内容)- 将用户输入写入文件

c - 如何用C语言对文本进行加密?

java - 使用双链表进行堆栈