日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用c语言链表做一个词典,电子字典C语言链表版

發布時間:2024/10/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用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语言链表版的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。