C程序设计中的改进链表

C程序设计中的改进链表,c,linked-list,C,Linked List,所以我得到了一个链表,当我向链表中添加新节点时,我正试图使链表反向。因此,我的链表包含两条数据和一个指向下一个对象的指针。添加新节点时,我希望该节点指向当前链接列表。我尝试过这样做,以便将当前列表的下一个指针指向当前链接列表,然后更改当前链接列表中的数据,但无法使其工作 下面是我的代码和我的尝试。它只是给了我一个循环链表,指向它自己 struct Node { void *data; int value; struct Node *next; }; struct

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

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

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);
所以它看起来是这样的


听起来你需要两个基本指针(列表和列表结束)

这样,您可以安排“列表”指向链中的第一个条目,并在最后一个条目指向“列表\端点”,您可以在任意一端添加新节点

如果您在跟踪指针时遇到问题,那么末端带有按钮的纸片和字符串可能会有所帮助:-)

此外,请注意,您应该确保清除malloc返回的内存或始终设置所有字段。(即:将“下一步”设置为零)


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

听起来您需要两个基本指针(list和list\u end)

这样,您可以安排“列表”指向链中的第一个条目,并在最后一个条目指向“列表\端点”,您可以在任意一端添加新节点

如果您在跟踪指针时遇到问题,那么末端带有按钮的纸片和字符串可能会有所帮助:-)

此外,请注意,您应该确保清除malloc返回的内存或始终设置所有字段。(即:将“下一步”设置为零)


嗯,;您也必须为每个列表节点执行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
}

您需要更改
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
}

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

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()

如果这是在程序结束时,您实际上不需要调用它-环境将回收内存。不过,这是一种很好的做法。

我想你想要的更像这样:

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()
。 如果这是在程序结束时,您实际上不需要调用它-环境将回收内存。然而,这是一种良好的做法