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