请用C语言编写这段代码
时间: 2024-03-26 16:35:50 浏览: 67
好的,以下是使用 C 语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_WORD_LEN 50
// 定义一个结构体表示单词及其出现次数
typedef struct Word {
char word[MAX_WORD_LEN + 1];
int count;
struct Word *next;
} Word;
// 将字符串中的所有字符转换为小写
void to_lower_case(char *str) {
for (int i = 0; str[i]; i++) {
str[i] = tolower(str[i]);
}
}
// 将单词插入链表中
void insert_word(Word **head, char *word) {
// 如果链表为空,则新建一个节点
if (*head == NULL) {
*head = (Word *) malloc(sizeof(Word));
strcpy((*head)->word, word);
(*head)->count = 1;
(*head)->next = NULL;
return;
}
// 遍历链表查找是否已经存在该单词
Word *p = *head;
while (p != NULL) {
if (strcmp(p->word, word) == 0) {
p->count++;
return;
}
p = p->next;
}
// 如果不存在该单词,则新建一个节点
Word *new_word = (Word *) malloc(sizeof(Word));
strcpy(new_word->word, word);
new_word->count = 1;
new_word->next = *head;
*head = new_word;
}
// 按字典顺序输出链表中的单词及其出现次数
void print_word_list(Word *head) {
// 将链表中的单词按字典顺序排序
Word *p, *q;
char tmp[MAX_WORD_LEN + 1];
int count;
for (p = head; p != NULL; p = p->next) {
for (q = p->next; q != NULL; q = q->next) {
if (strcmp(p->word, q->word) > 0) {
strcpy(tmp, p->word);
strcpy(p->word, q->word);
strcpy(q->word, tmp);
count = p->count;
p->count = q->count;
q->count = count;
}
}
}
// 输出链表中的单词及其出现次数
for (p = head; p != NULL; p = p->next) {
printf("%s: %d\n", p->word, p->count);
}
}
int main() {
// 打开文件并读取正文
FILE *fp = fopen("input.txt", "r");
if (fp == NULL) {
printf("Error: failed to open file.\n");
return 1;
}
char str[MAX_WORD_LEN + 1], word[MAX_WORD_LEN + 1];
int len, i, j;
Word *head = NULL;
while (fscanf(fp, "%s", str) != EOF) {
// 将字符串中的标点符号和数字去掉
len = strlen(str);
j = 0;
for (i = 0; i < len; i++) {
if (isalpha(str[i])) {
word[j++] = str[i];
}
}
word[j] = '\0';
// 将单词转换为小写并插入链表中
to_lower_case(word);
insert_word(&head, word);
}
fclose(fp);
// 按字典顺序输出链表中的单词及其出现次数
print_word_list(head);
// 释放链表所占用的内存
Word *p, *q;
for (p = head; p != NULL; p = q) {
q = p->next;
free(p);
}
return 0;
}
```
代码中使用了文件I/O从文件中读取正文,并使用链表储存每个单词及其出现次数。在插入单词时,如果链表中已经存在该单词,则将其出现次数加1;否则将其插入到链表头部。在输出单词时,将链表中的单词按字典顺序排序。最后,使用 free() 释放链表所占用的内存。
阅读全文