关键字索引表

本博客介绍如何建立一个以26个字母为节点的单链表关键字索引表,用于快速查找和插入以特定字母开头的单词。通过初始化、查找、插入和输出功能,实现对单词及其对应页码的有效管理。输入示例包括单词查找、按字母显示所有相关单词和程序退出操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6-1 关键字索引表 (100 分)
为某本书建立一个关键字索引表。首先建立一个单链表,有26个结点,每个结点分别代表字母a,b,c,…,x,y,z。每个字母结点又指向以该字母开头的关键字的链表,该链表以字母顺序为序。如图所示:(字母链表,即蓝色垂直方向链表可以用结构体数组代替;每个字母结点所带的链表,即水平方向红色链接的表,可以根据需要增加一个头结点)

在这里插入图片描述

输入一个单词,比如“cat”,程序从head所指向的结点‘a’开始,根据链接(蓝色箭头)依序找到‘c’,再从‘c’结点根据链接(红色箭头)依序查找“cat”。如果找到与之一致的单词,则输出该单词及所在的页码,否则输出“Not found such a word.”,然后输入页码值,将cat这个单词插入到红色链表的适当位置。如果输入@a,则输出全部以a为首的关键字及对应页码,如果没有以该字母为首的关键字,则输出“Not found any vocabularies.”,其他字母以此类推。输入@@,则程序结束。 第一个输入输出样例,在运行时的实际界面如下图:

listResult.jpg

即:

result.png

四个函数来实现索引表

初始化
建立一个LETTER型的链表,每个节点中letter存a到z二十六个字母,kwp指向一个KW型的节点,这个节点下一项指向空。建立这个节点可以方便后面进行后面的操作。

void imit(){
	char a = 'a';
	LETTER *p;
	head = p = (LETTER *)malloc(sizeof(LETTER));
	for(int i = 0; i < 26; i++){
		p->letter = a + i;
		p->kwp = (KW *)malloc(sizeof(KW));
		p->kwp->next = NULL;
		p->kwp->word[0] = 'a'-1;
		p->kwp->word[1] = '\0';
		p->next = (LETTER *)malloc(sizeof(LETTER));
		p = p->next;
	}
	p = NULL;
}

查找
先从LETTER的头节点遍历到与需要查找的字符串的首字母相匹配的letter的节点,然后再从该节点储存的kwp遍历到与需要查找的字符串相匹配的word的节点。如果遍历到空则无与该字符串匹配的节点需要调用插入函数。

int find(char f[]){
	LETTER *p = head;
	while(p->letter != f[0])
		p = p->next;
	KW *pt = p->kwp;
	while(strcmp(pt->word,f) != 0){
		pt = pt->next;
		if(pt == NULL)
			return 0;
	}
	printf("%s %d\n",pt->word,pt->page);
	return 1;
}

插入
遍历的过程与查找函数基本相同主要是要找到字典序大于该字符串或是空的前面插入该新节点。

void insert(char f[], int n){
	LETTER *p = head;
	while(p->letter != f[0])
		p = p->next;
	KW *pt, *pr;
	pt = pr = p->kwp;
	while(strcmp(pt->word, f)<0){
		pr = pt;
		pt = pt->next;
		if(pt == NULL)
			break;
	}
	KW *p1 = (KW *)malloc(sizeof(KW));
	p1->page = n;
	strcpy(p1->word, f);
	p1->next = pt;
	pr->next = p1;
}

输出首字母相同一类字符串
遍历与前面基本相同从LETTER的头节点遍历到与需要查找的字符串的首字母相匹配的letter的节点,从该结点的kwp开始遍历只到空为止。

void print(char f){
	LETTER *p = head;
	while(p->letter != f)
		p = p->next;
	KW *pt = p->kwp->next;
	if(!pt)
		puts("Not found any vocabularies.");
	else
		while(pt){
			printf("%s %d\n",pt->word,pt->page);
			pt = pt->next;
		}
}

结构体部分

#include <stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct KeyWord{
  char word[20];               //关键字
  int page;                    //所在页码
  struct KeyWord * next;       //指向同一个字母开头的且符合字母顺序的下一个关键字 
}KW;

typedef struct Letter{
  char letter;                  //字母
  KW * kwp;                     //指向以该字母开始的按字母顺序的第一个关键字
  struct Letter * next;         //指向按字母顺序的下一个字母
}LETTER;

大佬们轻点喷

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值