用C语言字典实现词典功能 C语言字典词典

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

#define MAXWORD 25
#define MAXMEAN 50

struct record { //记录结构_读者
    char word[MAXWORD+1];   //key
    char mean[MAXMEAN+1];
};

struct lnode {  //链表结点结构
    struct record data;
    struct lnode *next;
};

/* 函数声明 */
void Add(struct lnode *list);
void Search(struct lnode *list);
void Edit(struct lnode *list);
void Delete(struct lnode *list);
void Display(struct lnode *list);
struct lnode *SearchPrimarykey(struct lnode *list, char *key);
void InsertList(struct lnode *list, struct lnode *n);
void FreeList(struct lnode *list);
void DisplayTableHead(void);
void DisplayRecord(struct lnode *r);
void DisplayMenu(void);

/* 主程序 */
int main(int argc, char *argv[])
{
    struct lnode *dictionary;
    /* 功能选择,依次为:退出、添加、查找、删除、显示所有记录 */
    enum {EXIT, ADD, SEARCH, EDIT, DEL, DISP} function = DISP;

    /* 头结点 */
    dictionary = (struct lnode *)malloc(sizeof(struct lnode));
    if(dictionary != NULL) {
        dictionary->next = NULL; //初始化
    }

    while(function != EXIT) {
        DisplayMenu();
        scanf("%d",&function);
        while(function < EXIT || function > DISP) {
            scanf("%d",&function);
        }

        switch(function) {
    case ADD:
        Add(dictionary);
        break;
    case SEARCH:
        Search(dictionary);
        break;
    case EDIT:
        Edit(dictionary);
        break;
    case DEL:
        Delete(dictionary);
        break;
    case DISP:
        Display(dictionary);
        break;
    case EXIT:
        exit(0);
        break;
    default:
        printf("Input Error! Please input the right word.");
        break;
        }
    }
    FreeList(dictionary);
}

/* 添加 */
void Add(struct lnode *list)
{
    int i;
    struct record t;
    struct lnode *n, *r;

    /* 录入记录 */
    printf("Please input the word: ");
    getchar();
    gets(t.word);
    fflush(stdin);
    printf("Please input the meaning:");
    gets( t.mean);

    /* 判断记录是否已存在,若存在则显示记录,若不存在则添加记录 */
    if((r = SearchPrimarykey(list, t.word)) == NULL) {
        /* 申请lnode空间并初始化 */
        n = (struct lnode *)malloc(sizeof(struct lnode));
        if(n != NULL) {
            /* 复制记录 */
            strcpy((n->data).word,t.word);
            strcpy((n->data).mean, t.mean);
            /* 插入链表 */
            InsertList(list, n);
        }
    } else {
        printf("Record Existed!\n");
        DisplayTableHead();
        DisplayRecord(r);
    }
}

/* 修改 */
void Edit(struct lnode *list)
{
	
    struct record t;
    struct lnode *r, *p;
    char e[MAXWORD];
    p = list;

    printf("Please input the word you want to edit: ");
    getchar();
    gets(e);
    
    if((r = SearchPrimarykey(list, e)) != NULL) {
        fflush(stdin);
        printf("Please edit the word: ");
        gets(t.word);
        printf("Please edit the meaning:");
        gets(t.mean);

        /* 复制记录 */
        strcpy((r->data).word,t.word);
        strcpy((r->data).mean,t.mean);
       
        
    } else {
        printf("Record cann't find!\n");
    }
}
/* 查找 */
void Search(struct lnode *list)
{
    char e[MAXWORD];
    struct lnode *r;

    printf("Please input the word you want to search: ");
    getchar();
    gets(e);

    if((r = SearchPrimarykey(list, e)) != NULL) {
        DisplayTableHead();
        DisplayRecord(r);
    } else {
            printf("Cann't find the word.");
    }
}

/* 删除 */
void Delete(struct lnode *list)
{
    char e[MAXWORD];
    struct lnode *q, *p;
    q = list;
    p = list->next;

    printf("Please input the word you want to delete: ");
    getchar();
    gets(e);

    while(p != NULL) {
        if(strcmp((p->data).word, e) == 0) {
            q->next = p->next;
            free(p);    /* 释放空间 */
            return ;    /* 函数返回 */
        }
        q = p;
        p = p->next;
    }
}

/* 显示所有记录 */
void Display(struct lnode *list)
{
    int c = 0;
    struct lnode *p = list->next;

    printf("\n--------- ReaderMessage Display ---------\n");
    DisplayTableHead();
    while(p != NULL) {
        DisplayRecord(p);
        c++;    /* 记录条数 */
        p = p->next;
    }
    printf("\n--------- Total:  %d  Record(s) ---------\n",c);
}

/* 按主键查找 */
struct lnode *SearchPrimarykey(struct lnode *list, char *key)
{
    struct lnode *p = list->next;

    while (p != NULL) {
        if(strcmp((p->data).word, key) == 0) {
            return p;
        }
        p = p->next;
    }
    return NULL;
}

/* 将记录按姓名字母升序插入链表 */
void InsertList(struct lnode *list, struct lnode *n)
{
    struct lnode *p = list;

    while (p->next != NULL && strcmp((p->next->data).word, (n->data).word) < 0)
    {
        p = p->next;
    }
    n->next = p->next;
    p->next = n;
}

/* 释放整个链表空间 */
void FreeList(struct lnode *list)
{
    struct lnode *p = list;
    while(p->next != NULL) {
        p = p->next;
        free(list);
        list = p;
    }
    free(p);
}

/* 显示表头 */
void DisplayTableHead(void) {
    printf("%-10s %s\n","WORD","MEANING");
}

/* 显示一条记录 */
void DisplayRecord(struct lnode *r)
{
    printf("%-10s %s\n", (r->data).word, (r->data).mean);
}

/* 显示菜单 */
void DisplayMenu(void)
{
    printf("\n--------- ReaderMessage Menu ---------\n");
    printf("\n\t1.Add\n\t2.Search\n\t3.Edit\n\t4.Del\n\t5.Display\n\t0.Exit\n");
    printf("\nPlease select the function number(0-5):");
}
//代码来自segmentfault用户neebla的提问,我帮着解答了一下,在这感谢他的源码!提问地址:https://segmentfault.com/q/1010000007742436
  • 46
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
C语言中,可以使用二叉搜索树(BST)来实现词典。BST是一种二叉树结构,其中每个节点都包含一个键和一个值,并且左子树的键小于等于父节点的键,右子树的键大于等于父节点的键。这种结构使得在插入、搜索和删除节点时具有较快的速度。 一种实现BST的方法是使用指针来表示节点之间的关系。每个节点包含键、值和指向左子树和右子树的指针。插入一个新的节点时,可以比较该节点的键与当前节点的键大小关系,然后根据大小关系将其插入到左子树或右子树中。搜索一个键时,可以通过比较键与当前节点的键的大小关系来决定向左子树还是向右子树前进,直到找到匹配的键或遍历完整个树。 另一种实现词典的方式是使用哈希表,但在某些情况下,BST可能更适合。BST的一个优点是可以在O(log n)的时间复杂度内进行搜索、删除和插入操作,而哈希表的平均时间复杂度为O(1)。此外,BST的结构也可以支持一些其他的操作,如范围搜索和排序。 因此,如果你在C语言中优先考虑使用词典,二叉搜索树是一个很好的选择。它可以提供较快的搜索和插入操作,并且可以使用指针来表示节点之间的关系。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [quicknode:一个小型库,可使用BST(二进制搜索树)以C语言使用词典](https://download.csdn.net/download/weixin_42116921/18369030)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C语言实现八种排序算法](https://blog.csdn.net/m0_37816922/article/details/103439486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡宝全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值