繁体   English   中英

为什么我的列表只返回最近添加的元素?

[英]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)操作,这使分配和遍历变得更加简单,这意味着随着列表变大,从列表中获取特定元素需要花费更长的时间。

您有两个选择。

  1. 创建链接列表,您将可以插入任意数量的学生。 (每个学生还有一个指向下一个学生的指针(如果还有,则为NULL))

  2. 按照karlphillip的建议在学生上创建指针数组,但是添加新学生的方法将需要实现位置搜索或存储该位置。 (您必须弄清楚应该在哪里存储指向学生的指针)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM