解题思路:
1、存储:用哈希存储单词,并用文件链表记录单词所在文件,以及行号链表记录单词所在文件中的行号
2、查询:取各单词文件名交集,再取各文件名再行号并集
#include <stdio.h> #include <string.h> #include <malloc.h> #include <ctype.h> typedef char Element[51];//每行字符最多50个 //行号结点
typedef struct LNode { int LineNo; struct LNode *NextLine; }*LList,LNode; char word[101][101][51];//注意由于将#号也存入在word数组中,故文件行号最大101行 int F[101]; int L[101][101]; int ans=0;
//文件结点 typedef struct FNode { int FileNo; struct FNode *NextFile; LList Line; }*FList,FNode; //哈希结点 struct HashTbl { Element word; int flag; FList Next; };
//哈希表 typedef struct { int TableSize; struct HashTbl *TheCells; }*HashTable; //创建行号结点 LNode *CreateLNode(int LineNo) { LNode *l=(LNode*)malloc(sizeof(LNode)); l->LineNo=LineNo; l->NextLine=NULL; return l; }
//创建文件结点 FNode *CreateFNode(int FileNo,LNode *l) { FNode *f=(FNode*)malloc(sizeof(FNode)); f->FileNo=FileNo; f->NextFile=NULL; f->Line=l; return f; }
//哈希表初始化 HashTable Create(int size) { HashTable H=(HashTable)malloc(sizeof(HashTable)); H->TableSize=size; H->TheCells=(struct HashTbl *)malloc(sizeof(struct HashTbl)*size); while(size) { H->TheCells[--size].Next=NULL; H->TheCells[size].flag=0; } return H; }
//哈希函数 int Hash(HashTable H,Element Key) { unsigned int h=0; while(*Key!='