用c语言链表做一个词典,电子字典C语言链表版
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
struct dict
{
char *key;
char *content;
struct dict *next;//指向链表下一个节点的指针
};
//打开字典文件,并读取文件内容
int open_dict(struct dict **p, const char *dict_filename)//open dict.txt,and read dict
{
FILE *pfile = fopen(dict_filename, "r");//只读方式打开文件
if (p == NULL)
return 0;//打开文件失败,函数返回
char buf[2048] = { 0 };
size_t len = 0;
int i = 0;//计数器,记录读到到的词条总数
*p = (struct dict *)malloc(sizeof(struct dict));//分配链表首节点内存
memset(*p, 0, sizeof(struct dict));
struct dict *pD = *p;//pD指向链表首地址
while (!feof(pfile))//循环读取文件,直到文件末尾
{
memset(buf, 0, sizeof(buf));
fgets(buf, sizeof(buf), pfile);//读取文件一行
len = strlen(buf);//得到读取到字符串长度
if (len > 0)
{
pD->key = (char *)malloc(len);//根据字符串长度分配内存
memset(pD->key, 0, len);
strcpy(pD->key, &buf[1]);//将读取到的内容拷贝到key中
}
memset(buf, 0, sizeof(buf));
fgets(buf, sizeof(buf), pfile);
len = strlen(buf);
if (len > 0)
{
pD->content = (char *)malloc(len);
memset(pD->content, 0, len);
strcpy(pD->content, &buf[6]);
}
pD->next = (struct dict *)malloc(sizeof(struct dict));//为链表的下一个节点分配内存
memset(pD->next, 0, sizeof(struct dict));
pD = pD->next;//将pD指向下一个节点位置
i++;
}
fclose(pfile);//关闭字典文件
return i;//返回读取到的字典词条数
}
//根据关键字key,在字典中查找内容
int search_dict(const struct dict *p, int size, const char *key, char *content)
{
const struct dict *pD = p;
while (pD)//遍历字典
{
if ((pD->key) && (pD->content))
{
if (strncmp(pD->key, key, strlen(key)) == 0)
{
strcpy(content, pD->content);
return 1;//找到符合条件记录,返回1
}
}
pD = pD->next;//指向链表下一个节点位置
}
return 0;//没有找到符合条件记录,返回0
}
//释放链表内存
void free_dict(struct dict *p, int size)
{
struct dict *pD = p;
while (pD)
{
if (pD->key)//删除链表节点中key成员内存
free(pD->key);
if (pD->content)//删除链表节点中content成员内存
free(pD->content);
struct dict *tmp = pD->next;//保存链表下一个节点的地址
free(pD);//删除链表当前节点
pD = tmp;//p指向下一个节点的位置
}
}
int main(int argc, char *args[])
{
if (argc < 2)
{
printf("usage: %s dict-filename\n", args[0]);
return 0;//参数不足,程序退出
}
long start_ms = 0;//记录函数执行的开始时间
long end_ms = 0;//记录函数执行的结束时间
start_ms = clock();
struct dict *p = NULL;
int size = open_dict(&p, args[1]);//根据命令行第一个参数做为字典文件名,打开字典文件
if (size == 0)
return 0;//打开字典文件失败,程序退出
end_ms = clock();
printf("open_dict used %ld ms\n", end_ms - start_ms);//打印函数执行时间,单位:毫秒
char key[2048];
char content[2048];
while (1)
{
memset(key, 0, sizeof(key));
memset(content, 0, sizeof(content));
scanf("%s", key);//从键盘得到用户输入
if (strncmp(key, "command=exit", 12) == 0)
break;
start_ms = clock();
if (search_dict(p, size, key, content))//根据用户输入,在字典中检索
{
printf("%s", content);
} else
{
printf("not found\n");
}
end_ms = clock();
printf("search_dict used %ld ms\n", end_ms - start_ms);//打印函数执行时间,单位:毫秒
};
start_ms = clock();
free_dict(p, size);//释放链表内存
end_ms = clock();
printf("free_dict used %ld ms\n", end_ms - start_ms);//打印函数执行时间,单位:毫秒
return 0;
}
用c语言链表做一个词典,电子字典C语言链表版相关推荐
- c语言设计程序计算器,C语言程序设计,做一个简单计算器
题目: C语言程序设计,做一个简单计算器 程序内容有:加减乘除和平方,立方,开方等.用if或者swith结构来编程. 算加法时只输出加法的结果,算减法时只出减法的结果,如此类推. 解答: 已发送, # ...
- C语言结合VBS脚本编写朗读小工具,做一个能够发音的C语言程序
大家好!我就是小编,又见面了啊,有句话说"相聚是缘".我们既然有缘相聚在此,希望你对我有了一定的认识和了解,也能够关注下小编,这样就不会迷路哦,希望在往后的日子我们大家能继续相互鼓 ...
- C语言实现了一个具有头结点的单链表(附完整源码)
实现了一个具有头结点的单链表 有头结点的单链表 实现了一个具有头结点的单链表完整源码 有头结点的单链表 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中的任 ...
- python语言能做什么软件-什么是Python语言,Python语言可以用来做什么?
什么是Python语言? Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的JavaS ...
- 用c语言画出一个五角星图案,用c语言画出一个五角星图案.doc
用c语言画出一个五角星图案 感觉上五角星和六角星 的思路差不多,所以就不做重复劳动啦~嘿嘿O(∩_∩)O~ 以下公布一个非本人的代码,虽然感觉这个五角星画的不是很"正",但总体感觉 ...
- 用c语言写出一个榜单程序,C语言依然位居榜单前列,依然值得程序员学习
原标题:C语言依然位居榜单前列,依然值得程序员学习 关注.星标公众号,不错过精彩内容 如今,市面上编程语言几百种,很多人觉得Python. JAVA这种语言比较火,是不是C语言就不行了呢? 殊不知,C ...
- [ 逻辑锻炼] 用 JavaScript 做一个小游戏 ——2048 (详解版)
前言 这次使用了 vue 来编写 2048,主要目的是温习一下 vue. 但是好像没有用到太多 vue 的东西,==! 估计可能习惯了不用框架吧 之前由于时间关系没有对实现过程详细讲解,本次会详细讲解 ...
- 2048小游戏html制作,[ 逻辑锻炼] 用 JavaScript 做一个小游戏 ——2048 (详解版)
前言 这次使用了 vue 来编写 2048,主要目的是温习一下 vue. 但是好像没有用到太多 vue 的东西,==! 估计可能习惯了不用框架吧 之前由于时间关系没有对实现过程详细讲解,本次会详细讲解 ...
- 用链表做一个图书管理系统
这几天一直尝试去用链表写这个图书管理系统,本来想在图书管理系统中写个文件管理操作,写了挺久也没写对,最后只能在用户登录操作中写了个简单的文件管理操作.如果有哪里写的不好还请大家见谅!继续加油! 目录 ...
最新文章
- 吴恩达老师深度学习视频课笔记:构建机器学习项目(机器学习策略)(2)
- Knockout应用开发指南 第六章:加载或保存JSON数据
- testNG安装一直失败解决方法
- 电子科技大学计算机考研题,电子科技大学计算机科学与技术考研820历年真题
- aix oracle查看字符集,AIX下oracle 10g 修改字符集为ZHS16GBK
- php 高级搜索下拉框,高级搜索页面advancedsearch.php调用自定义字段
- 中学生计算机编程教学视频6,计算机科学速成课6:寄存器和内存【视频】
- 码农不得不做的P图辨识能力
- (22)System Verilog按时间顺序的通知需求(事件驱动)
- lisp封装成vla函数_[良心教程]分享最新最实用的按键精灵封装函数
- 荣耀v30鸿蒙5g是什么版本,标配双模5G全国通手机 荣耀V30马上就要来了
- 相分离相关文章阅读Intrinsically disordered linkers determine the interplay between phase separation and gelat
- 第03章-二进制、八进制、十进制、十六进制之间的转换-深博-专题视频课程
- C/C++后台开发基础知识
- 【游戏面包屑】时间回溯·逆流吧
- 安卓 Charles证书的安装
- 支付宝小程序生态服务商奖励发布,单个商家最高奖励5000元
- matlab仿真高尔顿正态分布源码,中心极限定理:从高尔顿板到麦克斯韦分布
- java web 下拉列表_关于web中下拉列表的几种实现方法
- Oracle安装与配置(Linux)