所以我有一个链表,当我向它添加新节点时,我试图使链表反向。所以我的链表包含两条数据和一个指向下一个对象的指针。当我添加一个新节点时,我希望该节点指向当前链表。我试过这样做,以便将当前列表的下一个指针指向当前链表,然后更改当前链表中的数据,但我无法让它工作。
下面是我的代码和我尝试过的。它只是给我一个指向自身的循环链表。
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/