使用结构体与指针实现数组元素有序遍历作业求助
问题排查与代码修复
我帮你梳理下代码里的核心问题,然后给出完全符合作业要求的修复版本:
代码里的主要问题
- 结构体不符合要求:作业明确要求
elem只需要name(长度≤20的字符串)和prev指针,你额外定义了next指针,反而打乱了逻辑 - 类型赋值错误:
listelem是int数组,但直接把int值赋值给Elem的name(char数组)是非法操作,需要把数字转换成字符串存入name - 变量初始化错误:手动逐个创建
a-y变量时,存在引用未定义变量的情况(比如Elem c = {listelem[2],&b,&d};里的d还没声明),而且重复给prev赋值完全冗余 - 随机数越界:
(rand() % 10 )+1生成的是1-10的数值,而数组索引是0-9,会导致后续访问越界,应该改为rand()%10生成0-9的合法索引 - 遍历逻辑错误:作业要求用
prev成员按输入顺序打印,但你错误地依赖next指针,且遍历方向不符合要求
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> // 严格遵循作业要求定义结构体:仅包含name和prev指针 typedef struct elem Elem; struct elem { char name[20]; struct elem *prev; }; int main() { int i; // 初始化随机数种子,确保每次运行生成不同的随机序列 srand((unsigned int)time(NULL)); // 创建可存储10个elem的数组,符合作业要求 Elem listelem[10]; // 记录最后一个被添加的元素指针,用于设置当前元素的prev Elem *last = NULL; // 用于存储遍历得到的元素指针,后续反向打印实现输入顺序输出 Elem *order[10]; int order_idx = 0; printf("元素输入顺序(数组索引):\n"); // 随机填充10个元素,每个新增元素的prev指向之前添加的元素 for (i = 0; i < 10; i++) { // 生成0-9的合法数组索引 int idx = rand() % 10; printf("%d ", idx); // 将索引转换为符合要求的字符串格式存入name snprintf(listelem[idx].name, sizeof(listelem[idx].name), "listitem[%d].name", idx); // 设置当前元素的prev为上一个添加的元素 listelem[idx].prev = last; // 更新last为当前元素,供下一个元素使用 last = &listelem[idx]; } printf("\n\n按输入顺序打印列表:\n"); // 使用prev成员遍历所有元素,从最后一个添加的元素开始往回走 Elem *current = last; while (current != NULL) { order[order_idx++] = current; current = current->prev; } // 反向遍历order数组,得到输入顺序的正向输出 for (i = order_idx - 1; i >= 0; i--) { printf("%s\n", order[i]->name); } return 0; }
修复说明
- 结构体调整:移除了多余的
next指针,严格匹配作业要求的结构 - 类型转换:用
snprintf把随机生成的索引转换成指定格式的字符串,存入name成员 - 动态设置prev:不再手动创建单个变量,而是通过数组+
last指针动态设置每个元素的prev,避免未定义变量的错误 - 合法随机数:生成0-9的合法索引,避免数组越界
- 符合要求的打印逻辑:通过
prev从最后一个元素往回遍历,把元素指针存入临时数组,再反向打印数组,实现按输入顺序输出,完全符合作业要求的“必须使用prev成员”的规则
内容的提问来源于stack exchange,提问作者vcb0127
相关产品推荐
相关产品推荐

