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 则不这样做空。
嗨,这可能是一个愚蠢的问题,可以通过简单的解决方案提出,但我在互联网上找不到答案。
所以我正在为考试锻炼身体并完成作业。该程序的任务是找出链表中心的值是多少(如果链表的长度是奇数)
结构定义是:
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 则不这样做空。