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日

相关文章

  • Java数据结构及算法实例:插入排序 Insertion Sort

    Java数据结构及算法实例:插入排序 Insertion Sort 算法简介 插入排序是一种简单的排序算法,它的工作方式是每次将一个待排序的元素与前面已经排好序的元素逐个比较,并插入到合适的位置。插入排序的时间复杂度为O(n^2),是一种比较低效的排序算法。 算法实现 以下是使用Java语言实现插入排序算法的代码: public static void in…

    数据结构 2023年5月17日
    00
  • JavaScript树形数据结构处理

    对于“JavaScript树形数据结构处理”的完整攻略,我将从以下几个方面进行讲解: 树形数据结构的简介 树形数据结构在JavaScript中的表示 树形数据结构的处理方法 示例说明 树形数据结构的简介 树形数据结构,是一种常见的数据结构,由多个节点组成,每个节点有一个父节点和多个子节点。树形数据结构通常用来表示层级关系的数据。 树形数据结构在JavaScr…

    数据结构 2023年5月17日
    00
  • 详解Java实现数据结构之并查集

    详解Java实现数据结构之并查集 简介 并查集是一种基于树型结构的数据结构,主要用于解决一些不交集问题。它支持两个操作: 合并两个元素所在的集合 判断两个元素是否在同一个集合中 在并查集中,每个节点都有一个指向其父节点的指针。如果一个节点的指针指向它本身,说明它是一个集合的根节点。 实现 我们用一个int类型的数组parent来表示每个节点的父节点。初始时,…

    数据结构 2023年5月17日
    00
  • 数据结构 – 绪论

    01.绪论 1. 概念 1.1 数据结构 数据 Data:信息的载体。能被计算机识别并处理的符号的集合。 数据元素 Data element:数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素往往由若干数据项组成。数据项是组成数据元素的不可分割的最小单位。 如学生的信息记录就是一个数据元素,它由学号、姓名、性别等组成。 数据对象 Data obje…

    算法与数据结构 2023年4月18日
    00
  • Java数据结构之顺序表的实现

    下面是“Java数据结构之顺序表的实现”的完整攻略: 标题:Java数据结构之顺序表的实现 一、什么是顺序表 顺序表是一种线性表结构,其数据元素在物理位置上是连续的,通过下标访问,具有随机访问的优点。 二、顺序表的实现 使用Java语言实现顺序表,需要定义以下三个类: 1. SeqList类 构造顺序表的数据结构,并定义了一些基本操作,如插入、删除、修改等。…

    数据结构 2023年5月17日
    00
  • go语言数据结构之前缀树Trie

    前缀树Trie 前缀树Trie是一种树形数据结构,被用于快速查找内存中的字符串数据。它非常适合存储大量的字符串,并且能够非常快速的查找以一个指定的字符串前缀开头的全部字符串。 相关术语 在学习前缀树Trie之前,需要掌握一下相关术语: 根节点:Trie树的根节点,代表空字符串。 边:连接两个节点的线,代表一个字符。 节点:表示一个字符串,可能是某个字符串的结…

    数据结构 2023年5月17日
    00
  • Java数据结构学习之栈和队列

    Java数据结构学习之栈和队列 什么是栈 栈(stack)是一种线性数据结构,它只能在一端进行插入和删除操作,这一端被称作栈顶(top)。栈的特点是先进后出(FILO,First-In-Last-Out),即最后进入的元素最先被删除。 栈的实现方式 栈可以使用数组或链表来实现。使用数组实现的栈称作顺序栈,使用链表实现的栈称作链式栈。以下是顺序栈的 Java …

    数据结构 2023年5月17日
    00
  • Javascript数据结构与算法之列表详解

    Javascript数据结构与算法之列表详解 简介 本文旨在讲解Javascript中数据结构和算法的列表。 列表定义和实现 列表是一组有序的数据,每个列表中的数据项称为元素。在Javascript中,列表可以用数组来实现。数组的好处是它能够存储任意类型的数据,而且可以根据需要动态地调整数组的大小。下面是一个创建列表的基本模板: function List(…

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