C编程中的修改链表

Modified Linked List in C Programming

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

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

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       |
+-------+----------------+

听起来你需要两个基指针(list 和 list_end)

这样你就可以安排 'list' 指向链中的第一个条目,'list_end' 指向最后一个条目,你可以在任一端添加新节点。

如果您在跟踪指针时遇到问题,末尾带有按钮的纸片和绳子可能会有所帮助:-)

另外,请注意,您应该确保清除 malloc 返回的内存或始终设置所有字段。 (即:将 'next' 设置为零)

嗯嗯;您也必须为每个列表节点执行 malloc。

您需要按如下方式更改 add() 方法。而且你的 add() 方法需要一个 struct Node 的指针类型(至少是某种类型)否则它会抛出编译器错误

void add(struct Node *data, int value); // Corrected add method prototype

并更正了add()方法

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

一个工作示例:

#include <stdio.h>
#include <stdlib.h>

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

struct Node *list;

void add(struct Node *data, int value);

int main()
{
    printf("Hello, World!\n");

    // Defining END node
    list = malloc(sizeof(struct Node));
    list->value = -1;
    list->next=NULL;

    // Adding data
    struct Node* temp=malloc(sizeof(struct Node));     
    add(temp,12);

    temp=malloc(sizeof(struct Node));     
    add(temp,20);

    temp=malloc(sizeof(struct Node));       
    add(temp,22);

    // Use Head to walk through the linked list
    temp=list;

   // Walk through it and verify order
    while(temp!=NULL){
        printf("%d \n",temp->value);
        temp=temp->next;
    }

    return 0;
}

void add(struct Node *data, int value){
       data->value = value;
       data->next=list;
       list=data; // list will always be the HEAD
}

输出:

20
12
-1

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

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()。 如果那是在程序的末尾,你真的不需要调用它——环境会回收内存。然而,这是一个很好的做法。