微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将链接列表数据获取到C中的String数组

如何解决将链接列表数据获取到C中的String数组

我具有此功能,其中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;
}

解决方法

我查看了您的代码之后,进行了一些更改:

  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;
}
,
        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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。