C 链表定义如何重新实现一个列表

C linked list define how to reimplement a list

嗨,这可能是一个愚蠢的问题,可以通过简单的解决方案提出,但我在互联网上找不到答案。

所以我正在为考试锻炼身体并完成作业。该程序的任务是找出链表中心的值是多少(如果链表的长度是奇数)

结构定义是:

typedef struct IntList IntList;
struct IntList {
    int value;
    IntList* next;
};

我现在的确切问题是当我尝试使用时出现分段错误:

list = list->next;

我想一步步循环到链表第n个位置(中心)的wished list

有人知道我必须如何重写这个吗?如果您需要更多信息来帮助,请直接说出来,我会解释更多。

使用该函数我检查了列表的长度,而在我的另一个函数中我有一个只到达长度中间的循环。

int length_list(IntList* list) {
    int n = 0;
    for(IntList* node = list; node != NULL; node = node->next) n++;
    return n;
}

在这个循环结束后 for(IntList* node = list; node != NULL; node = node->next) n++; 你肯定有 node==NULL.
这不是一个直接的问题。
但是根据您对 return 的 n 值所做的操作,您可能会遇到 off-by-one 问题。例如。在只有一个条目的列表中(毕竟 1 是奇数),尝试使用 1 太高的值可能会导致尝试访问 non-existing 节点。

因此,我怀疑您的问题可以通过将循环更改为 for(IntList* node = list; node->next != NULL; node = node->next) n++;,这样它就结束于最后一个存在的节点,而不是后面。 return 值会更低,无论你用它做什么都会是“more-careful”。

或者尝试与您显示并询问的小代码片段类似的事情,list = list->next; 仅在 next 不为 NULL 时才这样做,如果 list 不为 NULL 则不这样做空。