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日

相关文章

  • 2021最新Android笔试题总结美团Android岗职能要求

    2021最新Android笔试题总结和美团Android岗职能要求 简介 本文主要介绍了2021最新的Android笔试题总结和美团Android岗职能要求,旨在为正在面试美团Android岗位的面试者提供参考。 笔试题总结 下面是近期美团Android面试中出现的一些笔试题目: 1. 请描述Android中BroadcastReceiver的生命周期。 安…

    数据结构 2023年5月17日
    00
  • C语言数据结构与算法之时间空间复杂度入门

    C语言数据结构与算法之时间空间复杂度入门攻略 1. 什么是时间复杂度和空间复杂度? 在进行算法设计时,我们不仅需要考虑到算法的正确性,还要考虑到算法的执行效率。而衡量算法执行效率的指标主要有两个,即时间复杂度和空间复杂度: 时间复杂度:衡量算法所需时间的度量,通常用“大O”符号来表示。比如,对于n个元素的数组,某些算法需要执行n次操作,这个算法的时间复杂度就…

    数据结构 2023年5月16日
    00
  • C++高级数据结构之并查集

    C++高级数据结构之并查集 什么是并查集 并查集(Union Find Set)是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。 并查集定义了如下的三种操作: 1、makeSet(s):建立一个新的并查集,其中包含s个单元素集合。 2、unionSet(x, y):把元素x和元素y所在的集…

    数据结构 2023年5月17日
    00
  • C语言线性表顺序表示及实现

    C语言线性表顺序表示及实现 线性表的概念 线性表是一种数据结构,它是由n(n≥0)个数据元素a1,a2,…,an 组成的有限序列(元素个数为0时,称为空表),并且这些数据元素遵循一定的线性关系。 线性表的存储结构 线性表的存储结构有两种:顺序存储和链式存储。顺序存储指的是用一段连续的存储单元依次存储线性表的数据元素,线性表中的元素在物理位置上也是相邻的;…

    数据结构 2023年5月17日
    00
  • C++如何实现BitMap数据结构

    下面我将详细讲解C++如何实现BitMap数据结构的完整攻略,包含以下几个方面: 什么是BitMap数据结构 如何使用C++实现BitMap数据结构 BitMap数据结构的应用示例说明 1. 什么是BitMap数据结构 BitMap数据结构也叫位图,是一种非常简单而高效的数据结构,它主要是用来对大量数字进行存储和操作的。所谓BitMap,就是将一个数字序列通…

    数据结构 2023年5月17日
    00
  • C语言实现通用数据结构之通用链表

    C语言是一门广泛应用于低级别系统编程的语言,也是数据结构和算法学习的重要工具之一,而在C语言中实现通用数据结构的方法之一就是通用链表。 通用链表是一种使用节点来组织数据的通用数据结构,每个节点包含一定量的数据以及指向链表中下一个节点的指针,因此,它可以用来实现许多不同的数据结构,例如栈、队列、树、图、哈希表等等。 具体实现通用链表的方法如下: 步骤一:定义节…

    数据结构 2023年5月17日
    00
  • 【JavaScript快速排序算法】不同版本原理分析

    说明 快速排序(QuickSort),又称分区交换排序(partition-exchange sort),简称快排。快排是一种通过基准划分区块,再不断交换左右项的排序方式,其采用了分治法,减少了交换的次数。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速…

    算法与数据结构 2023年4月18日
    00
  • C++数据结构链表基本操作示例过程

    C++数据结构链表基本操作示例过程 链表是一种重要的数据结构,C++中链表的操作是非常常见的,下面我将详细介绍C++中链表的基本操作,包括创建链表、插入节点、删除节点和遍历链表等。 创建链表 首先,需要创建一个链表结构体,并定义节点类型struct Node,其中包含元素数据及下一个节点的指针。 struct Node { int data; Node* n…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部