c - 链表不打印所有值

标签 c linked-list

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

#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/

相关文章:

C 链表添加有序

c - 链表指针打印内存泄漏

python - 在 C 语言中,如何在用户输入的末尾连接 .txt?

C float 和双重比较

C 函数 - cd 表示不起作用

python - 为什么我们要为链表中的头节点创建不同的类?

python - “ListNode”对象不可迭代

Java - 通用链表值比较在值大于 127 时失败

c - Format String 漏洞困扰

objective-c - 在 C 代码中重复符号 _fopen_file_func,在 objective-c 项目中