C语言链表案例学习之通讯录的实现

让我详细讲解一下“C语言链表案例学习之通讯录的实现”的完整攻略。

1. 案例简介

本案例的目的是通过实现一个简单的通讯录程序,来学习C语言链表的原理和操作。程序主要功能涵盖通讯录添加、删除、修改以及查询。

2. 程序架构

程序的整体结构如下所示:

头文件声明

结构体定义

函数声明

主函数

函数实现

其中,头文件声明包含stdio.h、stdlib.h以及string.h,结构体定义包含三个结构体:单个联系人通讯录数据的Node结构体、通讯录的HeadNode结构体和联系人信息Contact结构体。函数声明包含CreateList()、AddNode()、PrintList()、DeleteNode()、ModifyNode()、QueryNode()、ClearList()七个函数,主函数负责程序的启动和关闭。函数实现主要包括各个功能函数的具体操作。

3. 主要函数说明

3.1 CreateList()

该函数的作用是创建一个通讯录链表并初始化。该函数会创建一个HeadNode结构体作为链表的头结点,并返回该结构体的地址。HeadNode结构体中包含一个指向第一个联系人节点的Node结构体指针。此外,HeadNode结构体还包含一个整型变量Size,表示当前链表中联系人的数量。函数代码如下:

HeadNode* CreateList()
{
    HeadNode* head =(HeadNode*)malloc(sizeof(HeadNode));  //创建头结点
    head->next = NULL;
    head->size = 0;
    return head;
}

3.2 AddNode()

该函数的作用是将一个联系人信息添加到通讯录链表的末尾。该函数会先创建一个Node结构体,并将联系人信息放入结构体中;然后将该结构体插入到链表的尾部。最后,更新HeadNode结构体中Size的值。函数代码如下:

void AddNode(HeadNode* head)
{
    Node* node = (Node*)malloc(sizeof(Node)); //创建新结点
    Contact* contact = (Contact*)malloc(sizeof(Contact)); //为联系人信息分配内存空间 
    printf("请输入联系人姓名:");
    scanf("%s",contact->name);
    printf("请输入联系人电话:");
    scanf("%s",contact->phone);
    node->contact = contact;
    node->next = NULL;
    //如果链表为空,新结点为头结点
    if(head->next == NULL)
    {
        head->next = node;
    }
    //如果链表不为空,则将结点加入到链表末尾
    else
    {
        Node* last = head->next;   //指向第一个结点
        while(last->next != NULL)
        {
            last = last->next;
        }
        last->next = node;
    }
    head->size++; //更新链表中联系人的数量
}

3.3 PrintList()

该函数的作用是打印整个通讯录链表。该函数会遍历整个链表,将每个联系人的信息依次输出。函数代码如下:

void PrintList(HeadNode* head)
{
    printf("联系人姓名\t联系人电话\n");
    Node* node = head->next; //指向第一个结点
    while(node != NULL)
    {
        printf("%s\t\t%s\n",node->contact->name,node->contact->phone);
        node = node->next;
    }
}

3.4 DeleteNode()

该函数的作用是删除通讯录中指定联系人的信息。该函数的实现过程如下:

  1. 首先依次遍历链表的每个结点,找到等于指定联系人姓名的结点;
  2. 将该结点从链表中删除,同时释放该结点所占用的内存空间;
  3. 更新HeadNode结构体中Size的值。

函数代码如下:

void DeleteNode(HeadNode* head,char* name)
{
    Node* node = head->next;  //指向第一个结点
    Node* last = head;   //指向头结点
    while(node != NULL)
    {
        if(strcmp(node->contact->name,name) == 0)
        {
            last->next = node->next;
            free(node);
            head->size--;   //更新链表中联系人的数量
            printf("删除成功!\n");
            return;
        }
        else
        {
            last = last->next;
            node = node->next;
        }
    } 
    printf("未找到联系人,请确认联系人信息是否正确!\n");
}

3.5 ModifyNode()

该函数的作用是修改通讯录中指定联系人的信息。该函数的实现过程如下:

  1. 首先依次遍历链表的每个结点,找到等于指定联系人姓名的结点;
  2. 将该结点中的联系人信息修改为新的信息;
  3. 完成修改操作。

函数代码如下:

void ModifyNode(HeadNode* head,char* name)
{
    Node* node = head->next;  //指向第一个结点
    while(node != NULL)
    {
        if(strcmp(node->contact->name,name) == 0)
        {
            printf("请重新输入联系人电话:");
            scanf("%s",node->contact->phone);
            printf("修改成功!\n");
            return;
        }
        else
        {
            node = node->next;
        }
    }
    printf("未找到联系人,请确认联系人信息是否正确!\n");
}

3.6 QueryNode()

该函数的作用是根据指定联系人姓名查询通讯录。该函数会遍历整个链表,对于每个结点进行判断,如果联系人姓名等于指定的姓名,则输出该联系人的详细信息。函数代码如下:

void QueryNode(HeadNode* head,char* name)
{
    Node* node = head->next;  //指向第一个结点
    while(node != NULL)
    {
        if(strcmp(node->contact->name,name) == 0)
        {
            printf("联系人姓名\t联系人电话\n");
            printf("%s\t\t%s\n",node->contact->name,node->contact->phone);
            return;
        }
        else
        {
            node = node->next;
        }
    }
    printf("未找到联系人,请确认联系人信息是否正确!\n");
}

3.7 ClearList()

该函数的作用是清空整个通讯录链表。该函数会遍历整个链表,依次删除链表中的每个结点,并释放其所占用的内存空间。函数代码如下:

void ClearList(HeadNode* head)
{
    Node* node = head->next;    //指向第一个结点
    Node* temp; //用于释放结点空间的临时指针
    while(node != NULL)
    {
        temp = node;
        node = node->next;
        free(temp);
    }
    head->next = NULL;
    head->size = 0; //更新链表中联系人的数量
    printf("通讯录已清空!\n");
}

4. 示例说明

4.1 添加联系人

运行程序,在输入命令后输入"a",按照提示输入联系人姓名和电话,即可完成添加操作,如下示例所示:

请输入命令:a
请输入联系人姓名:张三
请输入联系人电话:13388888888
添加成功!
请输入命令:

4.2 删除联系人

运行程序,在输入命令后输入"d",按照提示输入联系人姓名,即可完成删除操作,如下示例所示:

请输入命令:d
请输入要删除的联系人姓名:张三
删除成功!
请输入命令:

4.3 修改联系人

运行程序,在输入命令后输入"m",按照提示输入联系人姓名和电话,即可完成修改操作,如下示例所示:

请输入命令:m
请输入要修改的联系人姓名:张三
请重新输入联系人电话:15099999999
修改成功!
请输入命令:

4.4 查询联系人

运行程序,在输入命令后输入"q",按照提示输入联系人姓名,即可完成查询操作,如下示例所示:

请输入命令:q
请输入要查询的联系人姓名:张三
联系人姓名   联系人电话
张三      15099999999
请输入命令:

4.5 清空通讯录

运行程序,在输入命令后输入"c",即可完成清空操作,如下示例所示:

请输入命令:c
通讯录已清空!
请输入命令:

以上就是完整的“C语言链表案例学习之通讯录的实现”的攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言链表案例学习之通讯录的实现 - Python技术站

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

相关文章

  • JavaScript数据结构之链表的实现

    JavaScript数据结构之链表的实现 什么是链表 链表是一种线性数据结构,其中的元素在内存中不连续地存储,每个元素通常由一个存储元素本身的节点和一个指向下一个元素的引用组成。相比较于数组,链表具有如下优缺点: 优点:动态地添加或删除元素时,无需移动其它元素。(数组则需要移动其它元素) 缺点:不能随机地访问某个元素,必须从头开始顺序遍历。(而数组可以通过索…

    数据结构 2023年5月17日
    00
  • JavaScript 数据结构之集合创建(1)

    当我们在编写JavaScript程序时,有时需要使用数据结构来组织和表示数据。其中之一是集合,它是一组无序且唯一的项的集合。这里就介绍如何在JavaScript中创建集合。 1. 集合定义 集合是一种不同于数组或对象,由一组彼此无关的元素组成的数据结构。集合中的元素是唯一的,即不允许重复元素。 2. 集合的操作 JavaScript中的集合可以支持以下常见操…

    数据结构 2023年5月17日
    00
  • Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)

    Java数据结构及算法实例:快速计算二进制数中1的个数 简介 本文将介绍在Java中快速计算二进制数中1的个数的算法。本算法是一种基于位运算的算法,其核心思想是利用位运算的快捷性,将原问题转化为每次计算一位是否为1的问题,使得计算速度大大提升。 背景知识 在理解本算法之前,需要了解Java中的一些背景知识: 1. 位运算 Java中的位运算符有如下几个: &…

    数据结构 2023年5月17日
    00
  • C++数据结构之哈希表的实现

    以下是详细的讲解: C++数据结构之哈希表的实现 哈希表的概念 哈希表是一种能够实现快速查找的散列表,通过将关键字映射到哈希表中的一个位置来实现快速查找。哈希表的查询、删除时间复杂度为O(1),操作效率非常高,所以常常被用来对大量数据进行检索。 哈希表的实现 哈希函数 哈希函数的主要作用就是将任意长度的输入数据转化为固定长度的散列值,一般采用对关键字进行取模…

    数据结构 2023年5月17日
    00
  • MySQL底层数据结构选用B+树的原因

    MySQL底层数据结构选用B+树的原因主要是因为B+树具有以下优点: 能够快速查找B+树的查找速度非常快,时间复杂度为O(log n),在海量数据的环境中,能够快速定位目标数据。因为B+树每次查找只需要遍历树高度的次数,即使数据量很大,树的高度也很小。 能够高效地进行增删改操作B+树的平衡性能够保证树的高度非常小,大部分操作只需要遍历树的高度,而不是整颗树,…

    数据结构 2023年5月17日
    00
  • Java深入了解数据结构之优先级队列(堆)

    Java深入了解数据结构之优先级队列(堆) 本文将会详细介绍Java中的优先级队列,即堆数据结构的实现过程和使用方法。 什么是优先级队列? 在介绍优先级队列之前,我们需要了解先进先出队列(FIFO Queue)和后进先出队列(LIFO Queue,或称栈)的概念。FIFO Queue按照元素的插入顺序依次出队;而LIFO Queue则按照元素的插入顺序反向出…

    数据结构 2023年5月17日
    00
  • MySQL数据库体系架构详情

    MySQL数据库体系架构是MySQL数据库自身的发展和演变过程中逐渐形成的一个庞大的体系。这个体系由多个组件构成,包括连接器、查询缓存、解析器、优化器、执行器、存储引擎等多个部分,其中存储引擎是其中最具有代表性的组件之一。在这篇攻略中,我们将详细讲解MySQL数据库体系架构的各个部分,介绍它们各自的功能和作用。 连接器 MySQL的连接器负责与客户端建立连接…

    数据结构 2023年5月17日
    00
  • 【ACM算法竞赛日常训练】DAY4题解与分析【树】【子序列】| 组合数学 | 动态规划

    DAY4共2题: 树(组合数学) 子序列(dp,数学) ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 原文链接(阅读原文获得更好阅读体验):https://www.eriktse.com/algorithm/109…

    算法与数据结构 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部