在C语言中将链表数据转化为字符串数组

3
我有一个函数,其中list是指向链表的指针。这是包含数据节点的链表结构体。
typedef struct node{
    char *data;
    struct node *next;
}NODE;

typedef struct list{
    NODE* head;
    char *id;
    struct list *next;
    int size;
}LIST;

我的目标是将列表中的所有数据作为 **char 返回。看起来它工作正常,但在执行 words = (char**) calloc(numOfWords*wordLength,sizeof(char)); 这行代码时,我不确定它是否正确,并且它的具体工作原理是什么。您能否检查我的代码并帮助我看出问题所在?谢谢。

char **reset_words(LIST *list){
    char ** words;
    int i = 0,j = 0,wordLength,numOfWords = list->size;
    NODE *p;
    for (p = list->head; p != NULL; p = p->next) {
        wordLength = my_strlen(p->data);
        words = (char**) calloc(numOfWords*wordLength,sizeof(char));
        for(int k=0;k < wordLength;k++){
            words[i][j] = p->data[k];
            j++;
        }
        i++;
    }
    return words;
}

在C语言中,不需要对malloc(或callocrealloc)的返回值进行强制类型转换,这是不必要的。参见:Do I cast the result of malloc? - David C. Rankin
2个回答

3

经过我查看你的代码,这里有一些更改建议:

  1. 如果你的链表是正确构造的,并且所有节点数据的大小相同,那么你可以简单地使用 wordLength = strlen(list->head->data)
  2. 在循环外初始化单词。我所做的方式应该可以工作。
  3. 由于你有字符串,你可以简单地使用 strcpy(words[i],p->data) 将字符串添加到单词数组中。

尝试一下,让我知道它是否有效。

char **reset_words(LIST *list){
    char ** words;
    int i = 0,j = 0,wordLength = strlen(list->head->data),numOfWords = list->size;
    NODE *p;
    words = (char **)malloc(numOfWords * sizeof(char *));
    for (int h=0; h<numOfWords; h++)
        words[h] = (char *)calloc(wordLength,sizeof(char));
    for (p = list->head; p != NULL; p = p->next) {
        strcpy(words[i],p->data);
        i++;
    }
    return words;
}

0
        wordLength = my_strlen(p->data);

我不知道my_strlen()函数具体做什么。但你必须记得为末尾的\0留出额外的空间。

        words = (char**) calloc(numOfWords*wordLength,sizeof(char));

这个并不太有意义...numOfWords似乎是节点的数量,而wordLength是实际数据的长度。因此,numOfWords * wordLength可能用于计算所有字符的总空间(但仅当wordLength是最大字符串的长度时)。

根据您的要求(您是否真的需要复制字符串还是只需要引用?),您可以表达为:

char **words = calloc(list->size, sizeof words[0]);
size_t i = 0;
for (struct node *p = list->head; p; p = p->next) {
    if (1)
         words[i++] = p->data;
    else
         words[i++] = strdup(p->data);
}

我的strlen()函数是正确的,它与普通的strlen()函数完全相同。我假设所有单词的长度都相同。因此,第一个单词的长度就是所有单词的长度。该方法应该返回char[][]或*char[]或**char,这基本上是相同的东西。 我想复制这些单词,引用对我没有帮助。 - kyriakos0801

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接