基于C语言打造高效通讯录的示例代码

针对“基于C语言打造高效通讯录的示例代码”的完整攻略,我们可以分为以下几个步骤来进行讲解:

1.设计数据结构

在打造通讯录的代码中,我们需要首先设计合理的数据结构来储存通讯录信息。在此我们可以采用链表数据结构来实现。所以在数据结构的设计中,需要定义一个结构体来存储每位通讯录人员的信息,然后私有一个指向实体的指针来实现链表。

2.实现通讯录基本功能

通讯录的基本功能包括添加联系人、删除联系人、查看所有联系人以及根据姓名查找联系人等等。针对这些基本功能,我们需要实现相应的代码逻辑,基于定义好的数据结构来完成这些操作。示例代码如下:

void add_contact(struct ContactBook *book) {
    struct Contact *p = (struct Contact *)malloc(sizeof(struct Contact));
    printf("Please Input Contact Name: ");
    scanf("%s", p->name);
    // ...
    p->next = NULL;
    if (book->head == NULL) {
        book->head = p;
    } else {
        book->tail->next = p;
    }
    book->tail = p;
    book->size++;
}

void delete_contact(struct ContactBook *book, char *name) {
    struct Contact *p, *prev;
    prev = NULL, p = book->head;
    while (p != NULL) {
        if (strcmp(p->name, name) == 0) {
            if (p == book->head) {
                book->head = p->next;
            } else {
                prev->next = p->next;
            }
            if (p == book->tail) {
                book->tail = prev;
            }
            free(p);
            book->size--;
            printf("Delete Contact Successfully!\n");
            return;
        }
        prev = p, p = p->next;
    }
    printf("Contact Not Found!\n");
}

void list_all_contact(struct ContactBook *book) {
    printf("Here Are %d Contacts:\n", book->size);
    struct Contact *p = book->head;
    while (p != NULL) {
        printf("Name: %s\n", p->name);
        // ...
        p = p->next;
    }
}

void find_contact(struct ContactBook *book, char *name) {
    struct Contact *p = book->head;
    while (p != NULL) {
        if (strcmp(p->name, name) == 0) {
            printf("Name: %s\n", p->name);
            // ...
            return;
        }
        p = p->next;
    }
    printf("Contact Not Found!\n");
}

3.实现高效查询功能

为了提升程序的效率,我们可以将通讯录实现的更高效。例如可以将根据姓名查找联系人的操作由遍历整个链表来实现变为通过二叉搜索树实现。示例代码如下:

struct Contact *bst_find_contact(struct Contact *p, char *name) {
    if (p == NULL) return NULL;
    if (strcmp(p->name, name) == 0) return p;
    if (strcmp(p->name, name) < 0) return bst_find_contact(p->rchild, name);
    return bst_find_contact(p->lchild, name);
}

void find_contact(struct ContactBook *book, char *name) {
    struct Contact *p = bst_find_contact(book->root, name);
    if (p != NULL) {
        printf("Name: %s\n", p->name);
        // ...
    } else {
        printf("Contact Not Found!\n");
    }
}

以上就是基于C语言打造高效通讯录的示例代码的完整攻略。另外,以下提供两个实例说明:

实例一:如何添加联系人?

在打开通讯录后,输入“1”即可进入添加联系人操作。此时程序会提示您输入联系人的姓名,接着会将其余信息如电话、电子邮件等信息输入完毕后可以将联系人的信息存储到链表中。示例代码如下:

void add_contact(struct ContactBook *book) {
    struct Contact *p = (struct Contact *)malloc(sizeof(struct Contact));
    printf("Please Input Contact Name: ");
    scanf("%s", p->name);
    printf("Please Input Contact Tel: ");
    scanf("%s", p->tel);
    printf("Please Input Contact Email: ");
    scanf("%s", p->email);
    p->next = NULL;
    if (book->head == NULL) {
        book->head = p;
    } else {
        book->tail->next = p;
    }
    book->tail = p;
    book->size++;
}

实例二:如何删除联系人?

在打开通讯录后,输入“2”即可进入删除联系人操作。此时程序会提示您输入要删除的联系人的姓名,如果通讯录中有该联系人,则会删除该联系人,并打印“Delete Contact Successfully!"。如果通讯录中没有该联系人,则打印“Contact Not Found!"。示例代码如下:

void delete_contact(struct ContactBook *book, char *name) {
    struct Contact *p, *prev;
    prev = NULL, p = book->head;
    while (p != NULL) {
        if (strcmp(p->name, name) == 0) {
            if (p == book->head) {
                book->head = p->next;
            } else {
                prev->next = p->next;
            }
            if (p == book->tail) {
                book->tail = prev;
            }
            free(p);
            book->size--;
            printf("Delete Contact Successfully!\n");
            return;
        }
        prev = p, p = p->next;
    }
    printf("Contact Not Found!\n");
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于C语言打造高效通讯录的示例代码 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • C#创建线程带参数的方法

    C#创建线程带参数的方法,可以通过委托和Lambda表达式实现。以下是详细的攻略: 委托和Lambda表达式的简介 委托是C#中一个非常重要的概念,它是一种指向方法的指针,能够在需要的时候再调用这个方法。Lambda表达式是C#3.0引入的一项新特性,它是一种简化创建委托的语法。Lambda表达式实质是一个匿名函数,总是由多个参数,一个箭头符号和一个表达式组…

    C 2023年5月22日
    00
  • 完美解决PermGen space异常的问题

    针对完美解决PermGen space异常问题,我们可以按照以下步骤进行: 1. 确定出现异常的原因 PermGen space异常通常是由于应用程序需要加载的类或者使用的类库较多,而导致JVM分配给其的PermGen空间不足而发生的。因此我们首先需要确认是否是此原因导致的异常。 2. 调整JVM的参数设置 如果确认是PermGen space异常导致的,我…

    C 2023年5月23日
    00
  • C++11并发编程关于原子操作atomic的代码示例

    首先,为了保证代码并发时的正确性和可靠性,C++提供了原子操作atomic,它允许程序员指定特定的操作符进行原子操作。本文将详细讲解使用C++11原子操作的代码示例以及相关的攻略。 原子操作atomic 原子操作atomic是一种保证并发编程安全的工具,在多线程的情况下,可以保证一些关键代码块执行过程中的原子操作。原子操作可以避免竞态条件(Race Cond…

    C 2023年5月22日
    00
  • C语言 文件I/O

    下面是C语言文件I/O的完整使用攻略。 什么是文件I/O 文件I/O是指文件的输入/输出操作。C语言中,文件的读写操作主要通过<stdio.h>头文件中提供的函数实现。 文件的读写操作 打开文件 在进行文件读写前,首先需要打开文件: FILE *fopen(const char *filename, const char *mode); 其中,f…

    C 2023年5月9日
    00
  • C++你可能不知道地方小结

    C++你可能不知道地方小结攻略 1. 简介 本篇攻略为作者所撰写的一篇C++小结文章的详细讲解。在本文中,我们将会介绍作者在该篇文章中所总结的C++极易被忽视的几个问题。 2. 内容讲解 2.1. 匿名结构体/联合体 C++中,使用匿名结构体/联合体可以使代码更为简洁,但这样也会导致一些隐藏的问题。比如,考虑如下代码片段: struct Foo { stru…

    C 2023年5月30日
    00
  • C语言贪吃蛇经典小游戏

    下面是关于C语言贪吃蛇经典小游戏的完整攻略: 1.主要规则 在贪吃蛇游戏中,玩家需要通过操纵蛇将食物吃掉来增加自身得分,同时要避免蛇头碰到墙壁或者自己的身体,否则游戏失败。在游戏过程中,蛇头碰到界面的边缘将会被传送至对面的边缘。游戏结束后会显示玩家得分及重新开始游戏选项。 2.游戏操作 通过键盘的方向键控制蛇的移动,W键向上,A键向左,S键向下,D键向右; …

    C 2023年5月30日
    00
  • vue和react中关于插槽详解

    当我们在使用Vue或React构建组件时,经常会遇到需要给组件传递内容的情况。比如一个弹出框,需要在内容区域中传递不同的文本、表单或者其他组件作为content。这时候,我们可以使用插槽的概念来进行解决。 概述 插槽(Slot)是Vue和React中组件通信的一种技术,它允许我们在一个组件的模板中预留一定的位置,然后在使用该组件的父组件中,使用自定义的内容来…

    C 2023年5月23日
    00
  • VC6.0提示clexe执行出错怎么办? spawningc1exe错误的解决办法

    VC6.0提示clexe执行出错的解决办法 问题描述 在使用VC6.0编译程序时,可能会出现clexe执行出错的提示,这会导致编译无法完成,程序无法正常运行。这个错误一般是由于项目中的某些文件存在问题,导致编译器无法正常编译。 解决步骤 下面是解决clexe执行出错的步骤: 1. 清除编译中间文件 在VC6.0的菜单栏中选择“Build”-〉“Clean”命…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部