所以我有一个链表,当我向它添加新节点时,我试图反向制作链表。所以我的链表包含两个数据和一个指向下一个对象的指针。当我添加一个新节点时,我希望节点指向当前链接列表。我尝试过这样做,以便将当前列表指向当前链接列表的下一个指针,然后更改当前链接列表中的数据,但我无法使其工作。< / 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 | +-------+----------------+
答案 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()
。
如果在程序结束时你真的不需要调用它 - 环境将回收内存。不过这是很好的做法。