gpt4 book ai didi

c - 链表不打印所有值

转载 作者:太空宇宙 更新时间:2023-11-04 08:13:53 26 4
gpt4 key购买 nike

我正在编写一个链表作为一个更大项目的一部分,但遇到了一个问题。该测试用例采用逗号分隔的范围字符串(在这种情况下,范围是一个整数或两个由破折号分隔的整数),并将每个范围添加到一个单向链表中。目前,它只打印前两个范围,我不明白为什么。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char port_list[] = "22-25,80,443-445,4200-4205";

struct range_list {
struct range_list *next;
char *range;
};

struct range_list *head = (struct range_list*) malloc(sizeof(struct range_list));
head->next = 0;
head->range = strtok(port_list, ",");

struct range_list *iter = (struct range_list*) malloc(sizeof(struct range_list));
head->next = iter;
iter->next = 0;

while((iter->range = strtok(NULL, ",")) != NULL) {
iter = (struct range_list*) malloc(sizeof(struct range_list));
iter->next = iter;
iter->next = 0;
}

for(iter=head; iter != 0; iter=iter->next) {
printf("%s\n", iter->range);
}
}

目前,输出是:

22-25
80

理想情况下,我希望:

22-25
80
443-445
4200-4205

提前感谢您的帮助!我确定这是一个简单的问题。我只是害怕写链表,所以非常缺乏实践。

最佳答案

如果字符串中只有一个范围,您的代码就会出现问题。

因此,我会向您推荐一个更清洁的替代方案:

...
// as before, assuming ther's at least one range
struct range_list *head = (struct range_list*) malloc(sizeof(struct range_list));
head->next = 0;
head->range = strtok(port_list, ",");

struct range_list *iter=head, *tmp;
char *s;

while((s = strtok(NULL, ",")) != NULL) {
// there is a new item. So first create and initialise it
tmp = (struct range_list*) malloc(sizeof(struct range_list));
tmp->next=0;
tmp->range=s;
// then link it to the previous and interate
iter->next = tmp;
iter = iter->next;
}
...

这假设字符串中至少有一个范围要放入head

Online demo

请注意,range 指针指向原始缓冲区。这里没有问题,因为原始缓冲区保持不变。如果您使用的是 posix 系统,则可以考虑使用 strdup() 来制作范围字符串的安全副本,如果您的链接列表存在比缓冲区或其内容更长的生命周期的风险。

关于c - 链表不打印所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37077536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com