C编程中的修改链表

时间:2015-02-15 06:56:41

标签: c linked-list

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

嗯;你也必须为每个列表节点做一个malloc。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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()。 如果在程序结束时你真的不需要调用它 - 环境将回收内存。不过这是很好的做法。