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