⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 c语言编写的十字链表
💻 C
字号:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>

#define maxb 2//文章数
 
typedef struct headnode headnode;
typedef struct key key;
typedef struct idxnode idxnode;
typedef struct normal normal;


struct idxnode
{//索引号结点
	int idxnum[3];
	idxnode *down;
};

struct key
{//关键词结点
	char word[25];//一个单词最大长度定义为25
	int idx;//索引号个数
	idxnode *down;//指向索引号
	key *right;//指向下一个关键词
};

struct headnode
{//索引表头结点
	key *keyp;
	int keynum;//关键词个数
};

struct normal
{//平凡词结点
	char word[15];  //一个平凡单词数组,长度定义为15
	normal *p;
}; 

//-------------------------------(一)建立平凡词表--readnormal()-----------------------------------------------------------------------

normal *readnormal(normal *L)
{//将平凡词表读入内存
	int i,j;//j用来标记单词个数
	char c;//检查'\n'
	normal *a;
	FILE *normalfp;
	
	normalfp=fopen("normal.txt","r");
	if(normalfp==NULL)
	{
		printf("cannot open normal.txt\n");
		exit(0);
	}
    j=0;
	
	while((c=fgetc(normalfp))!=EOF)
	{
		i=0;
		a=(normal *)malloc(sizeof(normal));
	//	a->p = NULL;
		
		while(c!='\n')
		{
			a->word[i]=c;
			c=fgetc(normalfp);
			i++;
		}
		
		if(i!=0)
		{			
			a->word[i]='\0';
            a->p=L->p;
		    L->p=a;//插入头结点之后
			a=a->p;
			j+=1;
		}
		
	}
	fclose(normalfp);
    
	/*a=L->p;
	while(j>0 )
	{
		printf("%s\n",a->word);
		a=a->p;
		j-=1;
	}*/

	return L;
}


//------------------------------------(二)建立索引表-----------------------------------------------------------------------

int iskey(char *str,normal *norH)
{//判断是否为关键词
	normal *h;
	for(h=norH->p;h!=NULL;h=h->p)
	{
		if(!strcmp(h->word,str))
			return 0;
	}
	return 1;

}//iskey

//-----------------------------------------------------------------------------------------------------------

key *locate(headnode *head,char *buf,int s)
{//s=0代表该关键词不在索引表内,s=1则表示在索引表内,且返回该关键词结点指针
	int i,m;
	key *q;
	q=(key *)malloc(sizeof(key));
	q=head->keyp;
	
	for(i=0;i<head->keynum;i++,q=q->right)
	{
		m=strcmp(q->word,buf);
		if(m==0)
			break;
	}
	if(i==head->keynum)
	{
		s=0;
		return NULL;
		
	}
	else
	{
		s=1;
		return q;
	}
}//locate



//-----------------------------------------------------------------------------------------------------------

headnode *build(normal *L,headnode *head)
{//返回索引表头结点
	
	FILE *f;
	char c;//在文件中取字符
	int i,j,k,s;//书号,段号,行号,s在buf[]内做标记
	char filename[maxb][6];//书名数组
	char buf[25];//寄存单词


	
	idxnode *dp;
	key *rp,*p;

	
	head->keyp=NULL;
	head->keynum=0;

	for(i=0;i<maxb;i++)
	{//书名从0.txt开始
		filename[i][0]='1'+i;
		filename[i][1]='.';
		filename[i][2]='t';
		filename[i][3]='x';
		filename[i][4]='t';
		filename[i][5]='\0';
	}

	i=0;
	do
	{
		printf("%s",filename[i]);
		j=k=s=0;
		f=fopen(filename[i],"r");
		if(!f)
		{
			printf("openfile err");
			exit(0);
		}
		c=fgetc(f);
		while(c!=EOF)
		{//在一篇文章内循环
			if(c=='*')
			{
				j++;//'*'代表段首
				
			}
			else if(c=='\n')
				k++;//一行结束
			else if(isalpha(c))
			{
				if(isupper(c))//大写字母转换为小写
					c = tolower(c);
				buf[s++]=c;
			}
			
			else if((c==' '||c=='\n'||c==','||c=='.')&&buf[0]!='\0')
			{
				buf[s]='\0';
				k++;
				if(iskey(buf,L))
				{
					dp=(idxnode *)malloc(sizeof(idxnode));
					dp->idxnum[0]=i+1;
					dp->idxnum[1]=j;
					dp->idxnum[2]=k;
					dp->down=NULL;

					p=locate(head,buf,s);//s作为是否在索引表内的标记
					if(p == NULL)
					{//不在索引表内
						rp=(key *)malloc(sizeof(key));
					    strcpy(rp->word,buf);
						
						rp->down=dp;
						rp->idx=1;
						rp->right=head->keyp;
						head->keyp=rp;
						head->keynum++;
					}
					else
					{//在索引表内
						dp->down=p->down;
						p->down=dp;
						p->idx++;
					}
				}
				
				s=0;//buf为平凡词,则重新取词
				buf[s]='\0';
			}
							
			c=fgetc(f);
		}//while(c!=EOF)
		if(fclose(f))
		{
			printf("close file error");
			exit(0);//关闭未成功
		}
		i++;//下一本书
	}while(i<maxb);

	return head;
}

//-----------------------------------------------------------------------------------------------------------

void putout(headnode *head)
{
	FILE *f;
	int i,j;
	idxnode *dp;
	key *rp;

	dp=(idxnode *)malloc(sizeof(idxnode));
	rp=(key *)malloc(sizeof(key));
	rp=head->keyp;
	f=fopen("idxlist.txt","w");
		
	for(i=0;i<(head->keynum);i++,rp=rp->right)
	{
		fprintf(f,"%s\n",rp->word);
		dp=rp->down;
		for(j=0;j<rp->idx;j++,dp=dp->down)
			fprintf(f,"%d,%d,%d\n",dp->idxnum[0],dp->idxnum[1],dp->idxnum[2]);
	}

	if(fclose(f))
		exit(0);//关闭未成功
}
//-----------------------------打印文章------------------------------------------------------

void prt(int i,int j)
{//打印出含有关键词的文字段
	char fn[6];
	FILE *f;
	char c;
	int p;

	fn[0]='0'+i;
	fn[1]='.';
	fn[2]='t';
	fn[3]='x';
	fn[4]='t';
	fn[5]='\0';
	f=fopen(fn,"r");
	if(!f)
	{
		printf("openfile error");
		exit(0);
	}

	for(p=0;p<j;)
	{
		c=fgetc(f);
		if(c=='*')
			p++;
	}
	for(c=fgetc(f);c!='*'&&c!=EOF;c=fgetc(f))
		printf("%c",c);
	if(fclose(f))
		exit(0);//关闭未成功

	return;
}



//--------------------------------(三)查找关键词---------------------------------------------------------------------------

void searchkey(normal *L,headnode *head)
{
	int need,i,num,b=0;
	char qustword[25];//max 25
	idxnode *dp;
	key *rp;

	dp=(idxnode *)malloc(sizeof(idxnode));
	rp=(key *)malloc(sizeof(key));
	
	printf("是否需要搜索关键词(yes=1/no=0):");
	scanf("%d",&need);
	while(need)
	{//在索引表中逐个查找
		printf("请输入要查找的单词:");
		scanf("%s",qustword);
		if(iskey(qustword,L))
		{
		
			rp=locate(head,qustword,b);
			if(rp == NULL )
				printf("该词不在关键词词库内\n");
			else
			{
				i=rp->idx;
				printf("%s有%d个搜索结果\n是否需要显示索引号(yes=1/no=0):",qustword,i);
				scanf("%d",&need);
			
				if(need)
				{
					num=rp->idx;
					dp=rp->down;
					for(i=0;i<num;i++,dp=dp->down)
					{
						printf("\n书号,段号,行号\n%d,%d,%d\n",dp->idxnum[0],dp->idxnum[1],dp->idxnum[2]);
						prt(dp->idxnum[0],dp->idxnum[1]);
					}
				}//if
			}//else
		}//if
		else	
			printf("该词为平凡词\n");

		printf("是否继续搜索(yes=1/no=0):");
		scanf("%d",&need);
	}//while(need)
	return;
}




//-----------------------------------------------------------------------------------------------------------

void main()
{
	headnode *head;
	normal *norH;
	
	head=(headnode *)malloc(sizeof(headnode));
	norH=(normal *)malloc(sizeof(normal));
	norH->p = NULL;
	
    norH=readnormal(norH);
	head=build(norH,head);
	putout(head);
	searchkey(norH,head);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -