数据结构课程实践(3)
— 实验准备与设计
一题目:文本文件单词的检索与计数
(1)任务要求:
文本文件中每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写,统计给定单词在文本文件中出现的总次数,检索输出的某个单词出现在文本中的行号、在该行中出现的位置。
设计数据量大的文本,进行子串的查询处理,分析算法运行的时间效率,对所有输出的匹配位置结果进行验证,以证明算法设计和实现的正确性。
用朴素模式匹配算法或KMP算法实现字符串定位;
可正确读取,保存文本;
(2)目标:
建立一个文本文件,统计给定单词在文本文件中出现的总次数及位置
题目思路
首先将文章导入到程序中
其次根据kmp或朴素模式匹配算法定位单词位置
找到时count+1;
程序结束后打印count即总次数。
也可建立数组存取出现的位置。
#include
using namespace std;
struct danci
{
char s[20]; //单词
int colum; //所在行号
int n; //第n个单词
struct danci* next;
};
struct danci* read(struct danci* head); //建立一个单词链表
void chaxun1(struct danci* head, char* str); //求单词出现的总次数
void chaxun2(struct danci* head, char* str); //求单词第一次出现所在的行号及位置
int equal(char* s1, char* s2); //字符串匹配
int main()
{
struct danci* p = NULL;
p = read(p);
printf("请输入查询的单词:");
char str[30];
cin >> str;
chaxun1(p, str);
chaxun2(p, str);
return 0;
}
struct danci* read(struct danci* head)
{
FILE* fp;
if (fopen_s(&fp, “1.txt”, “r”) != NULL)//访问文件夹
{
printf(“无法打开此文件\n”);
exit(0);
}
struct danci* p, * q;
p = (struct danci*)malloc(sizeof(struct danci));
head = q = p;
char ch;
int col = 1;
int count = 1;
int i = 0;
ch = fgetc(fp);//文件夹里读取文件
while (ch != EOF) //从文件读取字符
{
if (ch == '\n') //当遇到‘.’或‘,’的下一字符为换行符
{
ch = fgetc(fp);
count = 1;
col += 1; //行数加一,个数重置一
continue;
}
while (ch != ' ' && ch != ',' && ch != '.' && ch != '\n' && ch != EOF)
{
p->s[i] = ch;
i++;
ch = fgetc(fp);
}
p->s[i] = '\0'; //加结束标志
i = 0;
p->colum = col;
p->n = count;
if (ch == ' ' || ch == ',' || ch == '.')
{
count += 1; //个数加一
}
if (ch == '\n')
{
count = 1;
col += 1; //行数加一,个数重置一
}
if (ch == EOF)
{
break;
}
q = p;
p = (struct danci*)malloc(sizeof(struct danci));
q->next = p;
ch = fgetc(fp);
}
q->next = NULL;
return head;
}
void chaxun1(struct danci* head, char* str)
{
int total = 0;
while (head != NULL)
{
if (equal(head->s, str))
total += 1;
head = head->next;
} //遍历整个链表
printf("%s 一共出现 %d 次\n", str, total);
}
void chaxun2(struct danci* head, char* str)
{
int flag = 0;
while (head != NULL)
{
if (equal(head->s, str))
{
flag = 1;
}
if (flag) {
printf("该单词:%s 出现的位置第%d行第%d个单词\n", str, head->colum, head->n);
flag = 0;
}
head = head->next;
} //遍历整个链表
}
int equal(char* s1, char* s2)
{
int i, l1, l2;
l1 = strlen(s1);
l2 = strlen(s2);
if (l1 != l2)
return 0;
for (i = 0; i < l1; i++)
{
if (s1[i] != s2[i])
return 0;
}
return 1;
}