在C中获取字符串数组的链表数据



我有这个函数,其中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()做什么。但您必须记住为后面的保留额外的空间。

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

最新更新