📄 wenxue.cpp
字号:
#define MAXSIZE 1000 //字符空间最大容量
#define MAXLEN 20 //单词最大长度
#define MAXNUM 16 //一行中单词最多个数
#include "stdio.h"
#include "stdlib.h"
typedef struct{ //单词类型
char word[MAXLEN]; //生成单词的字符空间
int len; //单词长度
}WordType;
struct { //文章中一行单词组成的有序链表
WordType data;
}Sequence[MAXNUM];
struct Node { //待查单词所在行号和指向下一个位置的指针
int line;
struct Node *next;
}Node,*link[MAXNUM];
struct { //待查单词组成的有序链表
WordType data;
int count;
struct Node *next;
}HeadNode[MAXNUM];
int ExtractWords(char s[MAXSIZE])
{ //从文章中提取一行单词并将其组成一有序单词链表,每个单词作为一个结点
//并返回该行单词个数
int i,j,k;
j=1;
for(i=0;s[i]!='\0';)
{for(;(!((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')))&&(s[i]!='\0');)
i++;
for(k=1;((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))&&(s[i]!='\0');)
{Sequence[j].data.word[k]=s[i];
k++;i++;}
Sequence[j].data.len=k-1;
j++;}
return(j-1);
}
int InputWords()
{ //输入待查单词并组成有序链表,每个单词作为一个结点
//单词之间以任意非字母字符间隔,以“Enter”键结束,并返回输入单词个数
int i,j,k;
char s[MAXSIZE]={'\0','\0'};
j=1;i=0;
printf("请输入要查询的单词(以Enter结束):\n");
s[i]=getchar();
do{i++;
scanf("%c",&s[i]);
}while(s[i]!='\n');
for(i=1;s[i]!='\0';i++)
{for(;!((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'));) i++;
for(k=1;(s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z');)
{HeadNode[j].data.word[k]=s[i];
k++;i++;}
HeadNode[j].data.len=k-1;
j++;}
return(j-1);
}
int WordCmp(WordType wd1,WordType wd2)
{ //单词比较,若相等返回“0”
int k=1;
while(k<=wd1.len&&k<=wd2.len){
if(wd1.word[k]==wd2.word[k]) k++;
else if(wd1.word[k]<wd2.word[k]) return(-1);
else return(1);}
if(wd1.len==wd2.len) return(0);
else if(wd1.len<wd2.len) return(-1);
else return(1);
}
void OutResult(int n)
{ //输出待查单词及其出现次数和所在行号
int i,j;
for(i=1;i<=n;i++){
printf("单词");
for(j=1;j<=HeadNode[i].data.len;j++)
printf("%c",HeadNode[i].data.word[j]);
printf("在文章中出现%d次 ",HeadNode[i].count);
if(HeadNode[i].count!=0){
printf("分别在第");
for(link[i]=HeadNode[i].next;link[i]->next!=NULL;link[i]=link[i]->next)
printf("%d ",link[i]->line);
printf("行");}
printf("\n");
}
}
void main()
{ //主函数
int linenum=0;
int m,n,i,j;
int num=0;
char filename[10];
char str[MAXSIZE];
FILE *fp;
printf("请输入文章名:");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{printf("cannot open the file!");
exit(0);}
for(i=1;i<=MAXNUM;i++){ //初始化
link[i]=(struct Node *)malloc(sizeof(struct Node));
HeadNode[i].next=link[i];
link[i]->next=NULL;
HeadNode[i].count=0;
}
m=InputWords();
for(;!feof(fp);)
{fgets(str,MAXSIZE,fp);
n=ExtractWords(str); //从文章中提取一行单词,并组成有序链表
linenum++; //记录当前行号
for(i=1;i<=m;i++){
num=0;
for(j=1;j<=n;j++){
if((WordCmp(HeadNode[i].data,Sequence[j].data))==0)
{ HeadNode[i].count++; //单词出现次数
num++;}}
if(num!=0){ //记录待查单词出现的行号
link[i]->line=linenum;
link[i]->next=(struct Node *)malloc(sizeof(struct Node));
link[i]=link[i]->next;
link[i]->next=NULL;}}}
OutResult(m);
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -