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日

相关文章

  • C语言植物大战数据结构希尔排序算法

    C语言植物大战数据结构希尔排序算法 什么是希尔排序 希尔排序是一种基于插入排序的排序算法,也叫做“缩小增量排序”。和插入排序不同的是,希尔排序的插入排序是对一定间隔的元素进行插入排序,而不是对数组中相邻的元素进行排序。 希尔排序的流程和方法 希尔排序的主要流程是根据元素间的间隔d,分组进行插入排序,依次减小d值。最后当d=1的时候,再按照插入排序的方法对整个…

    数据结构 2023年5月17日
    00
  • C++数据结构之文件压缩(哈夫曼树)实例详解

    我来为您详细讲解一下“C++数据结构之文件压缩(哈夫曼树)实例详解”这篇文章的完整攻略: 文章基本信息 标题:C++数据结构之文件压缩(哈夫曼树)实例详解 作者:Coder_XWG 发布时间:2019年12月24日 文章概述 该篇文章主要讲解了哈夫曼树在文件压缩方面的应用。通过实例讲解了如何使用哈夫曼编码将文件进行压缩,以及如何解压缩被压缩的文件,并对文章中…

    数据结构 2023年5月17日
    00
  • 虹科案例 | 虹科Domo商业智能,助力保险公司逃离繁杂数据池!

    金融行业的发展充满着不确定性,一个具备强大承保能力和精算专业知识的资金池,对于身处该领域的公司和个人都是十分必要的。 在全国城市联盟(NLC)的协助下成立的NCL Mutual会员制互助保险公司,为各个地区城市提供了稳定的再保险答案。,然而,面对数字化转型这场已经打响的战斗,NCL Mutual却因缺乏中心商业智能系统,在利用数据处理索赔和承保的能力受到了极…

    算法与数据结构 2023年4月17日
    00
  • C语言中关于树和二叉树的相关概念

    C语言中关于树和二叉树的相关概念 树的概念 在计算机科学中,树是一种非常常见的数据结构,它由一组节点(通常称为元素)和一组连接节点的边组成。树是一种无向的、连通的、无环的图形结构,其中有一个节点被称为根节点,它没有父节点,而其他节点都有一个父节点。 树的定义很抽象,但在程序设计中,我们通常会使用一个节点类来实现树结构。一个节点类通常包含两个元素:一个是表示当…

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

    C语言实现通用数据结构之通用椎栈 概述 通用椎栈(Generic Linked List Stack),简称GLL Stack,是一种通用的数据结构,能够以动态的方式存储和访问任意类型的数据。GLL Stack 采用链表实现,可以进行进栈(push)、出栈(pop)、查看栈顶元素(peek)、判断栈是否为空(isEmpty)等基本操作。 基本操作 数据结构定…

    数据结构 2023年5月17日
    00
  • C++数据结构哈希表详解

    C++数据结构哈希表详解 哈希表(Hash Table)是一种非常重要的数据结构,用于实现字典等各种应用。哈希表将关键字映射到一个固定大小的数据集合中,以支持常数时间复杂度的插入、查找和删除操作。哈希表的核心思想是将关键字通过哈希函数(Hash Function)映射到数据集合中的一个索引位置,哈希函数需要满足良好的散列性质,使得关键字能够均匀地散布在数据集…

    数据结构 2023年5月17日
    00
  • C语言数据结构中约瑟夫环问题探究

    C语言数据结构中约瑟夫环问题探究 什么是约瑟夫环问题? 约瑟夫环问题(Josephus problem)是一个经典的问题,据说是Flavius Josephus发现并命名的。该问题描述为,编号从1到n的n个人按照顺时针方向围坐成一圈,每人持有一个密码。从第1个人开始,顺时针方向每次完整的数m个人,然后让这m个人出圈并把他们的密码拿走不算。当到达队尾时,又从队…

    数据结构 2023年5月17日
    00
  • JavaScript 数据结构之散列表的创建(2)

    下面是详细讲解“JavaScript 数据结构之散列表的创建(2)”的完整攻略。 散列表(哈希表) 散列表是一种数据结构,使用哈希函数将键映射到索引。散列表可以在常量时间 O(1) 中进行插入、删除和查找操作,但也具有碰撞冲突问题。 碰撞冲突问题 在散列表中,当两个不同的键通过哈希函数映射到了同一个索引位置时,就会发生碰撞冲突问题。解决碰撞冲突问题的方法有很…

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