gpt4 book ai didi

c - 将文件读入链表

转载 作者:行者123 更新时间:2023-11-30 18:18:25 25 4
gpt4 key购买 nike

我正在尝试读取我制作成链接列表的文本文件,该文本文件如下所示:

 around 1 2 1
bread 2 4 3 5 1
four 1 3 2
head 3 1 2 2 1 5 1
has 2 3 1 5 2

每行的第一个字符串只是段落中的单词。单词后面的第一个数字是在段落中找到该单词的行数。那么接下来的数字是段落中的(行,出现次数)对。

例如,对于单词bread:

在该段落的 2 行中找到它。在第一行 4 中,它被找到 3 次。然后在第二行5行中,找到了1次。

我正在尝试从此文本文件创建一个链接列表,到目前为止我的程序如下所示:

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

#define MAXWORD 999

typedef struct node node_t;

struct node {
char *word;
int num_lines;
int paragraph;
int freq;
node_t *next;
};

int
main(int argc, char *argv[]) {
FILE *fp;
char word[MAXWORD+1];
int ch, line_count = 0, len = 0;
node_t *node = (node_t*)malloc(sizeof(*node));
node_t *curr, *prev;

fp = fopen(argv[1], "r");

if (fp == NULL) {
fprintf(stderr, "Error reading file\n");
exit(EXIT_FAILURE);
}

/* Just trying to store the string so far */
while ((ch = getc(fp)) != EOF) {
if (ch == '\n') {
line_count++;
strcpy(node->word, word);
}

if (isalpha(ch)) {
word[len] = ch;
len++;
word[len] = '\0';
}

if (isdigit(ch)) {
len = 0;
}
}

printf("line count = %d", line_count);

free(node)

fclose(fp);

return 0;
}

在这段代码中,我一直在尝试将字符串存储在链表数据结构中,但我还没有使用动态数组来存储文本文件中出现的单词后面的数字。我知道我需要使用 malloc()realloc() 构建此数据结构,但我不确定如何执行此操作。

我应该怎么做?

我想要的输出如下所示:

There are five words in the text file, 
and 9 pairs of (line, occurences)

Word: pairs
"around": 2,1
"bread": 4,3; 5,1
"four": 3,2
"head": 1,2; 2,1; 5,1
"has": 3,1; 5,2

更新

我一直在研究这个问题,它似乎与倒排索引问题非常相似,我发现使用二叉搜索树是最好的。

我可以像这样实现我的二叉搜索树吗:

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

#define MAXWORD 999

typedef char word_t[MAXWORD+1];

typedef struct node node_t;

struct node {
void *data;
int *ints;
node_t *rght;
node_t *left;
};

typedef struct {
node_t *root;
int (*cmp)(void*, void*);
} tree_t;

int
main(int argc, char *argv[]) {
FILE *fp;

fp = fopen(argv[1], "r");

if (fp == NULL) {
fprintf(stderr, "Error reading file\n");
exit(EXIT_FAILURE);
}

while ((ch = getc(fp)) != EOF) {
if (ch == '\n') {
line_count++;
}
}

fclose(fp);

return 0;
}

最佳答案

你可以这样做:

typedef struct {
int paragraph;
int freq;
} stats_t;

struct node {
char *word;
int num_lines;
stats_t *stats;
node_t *next;
};

然后在解析字符串后,您可以执行以下操作:

ps = calloc(line_count, sizeof(stats_t));

获取指向 stats_t 结构数组的指针,您可以用行位置和频率填充该数组。然后,您可以将指针 ps 存储在 node 结构中。

关于c - 将文件读入链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39728218/

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