[英]Why does my linked list only contain one node even though I added more than one?
[英]Why does my list only ever return the element most recently added?
再次问候,
我在C上又遇到了这个问题,但是现在使用struct。 有这样的学生结构
struct student {
char *name;
int age;
}
我想要一个列表,可以在其中添加一些Student,也可以查看其所有元素。 这是我到目前为止完成的代码。
#include<stdio.h>
#include<stdlib.h>
// struct student ...
void add(student **list, char* name, int age) {
student* temp = (student *)malloc(sizeof(student));
temp->name = name
temp->age = age;
*list = temp;
*(list++) = (student *)malloc(sizeof(student));
}
void view(student **list) {
student* data = *list;
while(data != '\0') { printf("%s%i", data->name, data->age); *(data++); }
}
main() {
student* list = (student *)malloc(sizeof(student));
char* name = (char *)malloc(sizeof(char));
int age=0;
// inputs for name and age
// do-while(option != EXIT_VALUE);
// inside do-while are the following below
add(&list, name, age);
view(&list);
}
我只有最新的学生使用view方法。
这很有意义,因为您正在为1个单一学生结构分配空间:
student* list = (student *)malloc(sizeof(student));
您应该执行以下操作:
int list_size = 20;
student* list = (student *)malloc(sizeof(student) * list_size);
name
变量遭受相同的问题。
动态链接列表应参考下一个和上一个元素。 您必须更改程序才能使用:
struct student {
char *name;
int age;
struct student* next;
struct student* previous;
}
另外,您正在执行*(data++)
,这不是必需的。 data++
很好。 您真的不应该到处都需要双指针,它只会使事情变得复杂。 对于分配来说,很好(如果您认为这是最好的方法),但是对于传递给仅读取指针的其他函数,则不需要。
我只有最新的学生使用view方法。
void add(student **list, char* name, int age) {
student* temp = (student *)malloc(sizeof(student));
temp->name = name
temp->age = age;
*list = temp;
*(list++) = (student *)malloc(sizeof(student));
}
请注意,您正在使list
指向新分配的内存位置。 它指向的先前值丢失,并且还会导致内存泄漏。 因此,只有您才能获得最后一个条目。 您需要实现类似结构的链表。
struct student {
char *name;
int age;
struct student *next ;
}
// ....
void add(student **list, char* name, int age) {
// Make sure that every new location is saved in next
// And also the next time when you call this method, it should be
// location of "next" pointing to being passed as parameter.
}
int main()
{
student *list = malloc(sizeof(student)); // No need to type cast malloc
student *preserveHeadNode = list ;
add(&list, name, age);
// .. While viewing pass the "preserveHeadNode" and run the loop until
// student::next == NULL
}
view
期望list
是指向学生的指针的数组(以NULL结尾)。 但是,您在main中将其分配为指向单个学生的指针。 然后,您只需在每次调用add
时重新分配该学生指针。 正如克里斯所说,仅列出一份学生名单可能会很好(而且更简单)。
如果要将列表实现为数组,则需要一种策略以在列表大于初始数组大小时重新分配它。 一种典型的策略是选择一个任意大小,该大小将处理大多数情况而不会浪费大量内存,然后在达到限制时将其数量加倍。 因此,假设您从一个8元素列表开始。 当您添加第9个元素时,它将把数组重新分配给16个元素的列表。
另一种策略是使用链表,在链表中,您将一个结构指针(通常称为“下一个”)添加到结构中,并使用它来遍历列表。 尽管列表检索变成了O(n)操作而不是O(1)操作,这使分配和遍历变得更加简单,这意味着随着列表变大,从列表中获取特定元素需要花费更长的时间。
您有两个选择。
创建链接列表,您将可以插入任意数量的学生。 (每个学生还有一个指向下一个学生的指针(如果还有,则为NULL))
按照karlphillip的建议在学生上创建指针数组,但是添加新学生的方法将需要实现位置搜索或存储该位置。 (您必须弄清楚应该在哪里存储指向学生的指针)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.