【数据结构与算法篇】动态顺序表实战项目:通讯录

【数据结构与算法】动态顺序表实战项目:通讯录

🥕个人主页:开敲🍉

🔥所属专栏:数据结构与算法🍅

目录

【数据结构与算法】动态顺序表实战项目:通讯录

​编辑

1. PerInfo.h 头文件声明

2. PerInfo.c 源文件定义

3. Test.c 源文件测试

  动态顺序表实战项目:通讯录,近500行的实现代码。

1. PerInfo.h 头文件声明

#pragma once

#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100


typedef struct PerInfo
{
    char name[NAME_MAX];
    char gender[GENDER_MAX];
    int age;
    char tel[TEL_MAX];
    char addr[ADDR_MAX];
    int size;
    int capacity;
}PerInfo;


typedef struct SeqList
{
    PerInfo* arr;
    int size;
    int capacity;
}SL;


//初始化
void PerInfoInit(SL* per);

//打印
void PerInfoPrint(SL* per);


//释放
void PerInfoRelease(SL* per);

//插入数据(尾插)
void PerInfoPushBack(SL* per);

//插入数据(头插)
void PerInfoPushHead(SL* per);

//插入数据(指定插入)
void PerInfoPushDesi(SL* per);


//删除数据(尾删)
void PerInfoPopBack(SL* per);

//删除数据(头删)
void PerInfoPopHead(SL* per);

//删除数据(指定删除)
void PerInfoPopDesi(SL* per);

//查
void PerInfoFind(SL* per);

//改
void PerInfoChange(SL* per);
 

  

2. PerInfo.c 源文件定义

#define _CRT_SECURE_NO_WARNINGS 1

#include "PerInfo.h"


//初始化
void PerInfoInit(SL* per)
{
    assert(per);
    per->arr = (PerInfo*)calloc(sizeof(PerInfo),sizeof(PerInfo));
    per->size = 0;
    per->capacity = sizeof(PerInfo);
}


//释放
void PerInfoRelease(SL* per)
{
    if (per->arr)
    {
        free(per->arr);
    }
    per->arr = NULL;
    per->capacity = per->size = 0;
}


//打印
void PerInfoPrint(SL* per)
{
    printf("姓名             性别             年龄             电话             地址\n");
    assert(per);
    int i = 0;
    if (per->size == 0)
    {
        printf("\n                           (无联系人)\n");
        return;
    }
    for (i = 0; i < per->size; i++)
    {
        printf("%s      %10s      %4d      %15s      %15s",
                                per->arr[i].name,
                                per->arr[i].gender,
                                per->arr[i].age,
                                per->arr[i].tel,
                                per->arr[i].addr
        );
        printf("\n");
    }
    printf("\n");
}


//插入数据(尾插)
void PerInfoPushBack(SL* per)
{
    assert(per);
     //扩容
    while (per->size >= per->capacity)
    {
        PerInfo* ptr = (PerInfo*)realloc(per->arr, sizeof(PerInfo) * (per->capacity) * 2);
        if (ptr == NULL)
        {
            perror("realloc");
            return;
        }
        per->arr = ptr;
    }
    per->capacity *= 2;
    printf("请输入要添加的联系人姓名:");
    scanf("%s", per->arr[per->size].name);
    printf("请输入要添加的联系人性别:");
    scanf("%s", per->arr[per->size].gender);
    printf("请输入要添加的联系人年龄:");
    scanf("%d", &(per->arr[per->size].age));
    printf("请输入要添加的联系人电话:");
    scanf("%s", per->arr[per->size].tel);
    printf("请输入要添加的联系人地址:");
    scanf("%s", per->arr[per->size].addr);
    per->size++;
}


//插入数据(头插)
void PerInfoPushHead(SL* per)
{
    assert(per);
    int num = per->size;
    //扩容
    while (per->size >= per->capacity)
    {
        PerInfo* ptr = (PerInfo*)realloc(per->arr, sizeof(PerInfo) * (per->capacity) * 2);
        if (ptr == NULL)
        {
            perror("realloc");
            return;
        }
        per->arr = ptr;
    }
    while (num > 0)
    {
        per->arr[num] = per->arr[num - 1];
        num--;
    }
    printf("请输入要添加的联系人姓名:");
    scanf("%s", per->arr[0].name);
    printf("请输入要添加的联系人性别:");
    scanf("%s", per->arr[0].gender);
    printf("请输入要添加的联系人年龄:");
    scanf("%d", &(per->arr[0].age));
    printf("请输入要添加的联系人电话:");
    scanf("%s", per->arr[0].tel);
    printf("请输入要添加的联系人地址:");
    scanf("%s", per->arr[0].addr);
    per->size++;
}

//插入数据(指定插入)
void PerInfoPushDesi(SL* per)
{
    assert(per);
    //扩容
    while (per->size >= per->capacity)
    {
        PerInfo* ptr = (PerInfo*)realloc(per->arr, sizeof(PerInfo) * (per->capacity) * 2);
        if (ptr == NULL)
        {
            perror("realloc");
            return;
        }
        per->arr = ptr;
    }
    int adr = 0;
    printf("请输入要插入的位置:");
    scanf("%d", &adr);
    int num = per->size;
    while (num >= adr)
    {
        per->arr[num] = per->arr[num - 1];
        num--;
    }
    printf("请输入要添加的联系人姓名:");
    scanf("%s", per->arr[adr-1].name);
    printf("请输入要添加的联系人性别:");
    scanf("%s", per->arr[adr-1].gender);
    printf("请输入要添加的联系人年龄:");
    scanf("%d", &(per->arr[adr-1].age));
    printf("请输入要添加的联系人电话:");
    scanf("%s", per->arr[adr-1].tel);
    printf("请输入要添加的联系人地址:");
    scanf("%s", per->arr[adr-1].addr);
    per->size++;
}


int FindByName(SL* per,char* adr)
{
    int i = 0;
    for (i = 0; i < per->size; i++)
    {
        if (0 == strcmp(adr, per->arr[i].name))
        {
            return i;
        }
    }
    return -1;
}

//删除数据(尾删)
void PerInfoPopBack(SL* per)
{
    assert(per);
    if (per->size > 0)
    {
        per->size--;
    }
    else
    {
        printf("删除失败:没有数据可以删除\n");
        return;
    }
}

//删除数据(头删)
void PerInfoPopHead(SL* per)
{
    assert(per);
    int num = 0;
    if (per->size > 0)
    {
        while (num < per->size)
        {
            per->arr[num] = per->arr[num + 1];
            num++;
        }
    }
    else
    {
        printf("删除失败:没有数据可以删除\n");
        return;
    }
    per->size--;
}


//删除数据(指定删除)
void PerInfoPopDesi(SL* per)
{
    assert(per);
    char adr[NAME_MAX] = { 0 };
    printf("请输入要删除的联系人姓名:");
    scanf("%s", adr);
    int find = FindByName(per,adr);
    if (find >= 0 && find < per->size)
    {
        int flag = find;
        while (flag < per->size)
        {
            per->arr[flag] = per->arr[flag + 1];
            flag++;
        }
        printf("删除成功\n");
    }
    else
    {
        printf("删除失败:该位置没有数据可以删除\n");
        return;
    }
    per->size--;
}

//查
void PerInfoFind(SL* per)
{
    assert(per);
    char adr[NAME_MAX] = { 0 };
    printf("请输入要查询的联系人姓名:");
    scanf("%s", adr);
    int find = FindByName(per,adr);
    if (find >= 0 && find < per->size)
    {
        printf("查询成功:\n");
        printf("姓名             性别             年龄             电话             地址\n");
        printf("%s      %10s      %4d      %15s      %15s",
            per->arr[find].name,
            per->arr[find].gender,
            per->arr[find].age,
            per->arr[find].tel,
            per->arr[find].addr
        );
    }
    else
    {
        printf("查无此人\n");
        return;
    }
}


//改
void PerInfoChange(SL* per)
{
    assert(per);
    char adr[NAME_MAX] = { 0 };
    printf("请输入要更改的联系人姓名:");
    scanf("%s", adr);
    int find = FindByName(per, adr);
    if (find >= 0 && find < per->size)
    {
        printf("请输入要修改的内容代号(姓名:name、性别:gen:、年龄:age、电话:tel、地址:addr):");
        char s[100] = { 0 };
        lable:
        scanf("%s", s);
        if (0 == strcmp(s, "name"))
        {
            printf("请输入更换后的名字:");
            scanf("%s", per->arr[find].name);
        }
        else if (0 == strcmp(s, "gen"))
        {
            printf("请输入更换后的性别:");
            scanf("%s", per->arr[find].gender);
        }
        else if (0 == strcmp(s, "age"))
        {
            printf("请输入更换后的年龄:");
            scanf("%d", &(per->arr[find].age));
        }
        else if (0 == strcmp(s, "tel"))
        {
            printf("请输入更换后的电话:");
            scanf("%s", per->arr[find].tel);
        }
        else if (0 == strcmp(s, "addr"))
        {
            printf("请输入更换后的地址:");
            scanf("%s", per->arr[find].addr);
        }
        else
        {
            printf("输入有误,请重新输入:");
            goto lable;
        }
    }
    else
    {
        printf("查无此人\n");
        return;
    }
}

3. Test.c 源文件测试

#define _CRT_SECURE_NO_WARNINGS 1

#include "PerInfo.h"

void menu()
{
    printf("*******************************************\n");
    printf("*********** 1. 尾插   2. 头插 *************\n");
    printf("*********** 3. 尾删   4. 头删 *************\n");
    printf("********* 5. 指定插入  6. 指定删除 ********\n");
    printf("*********** 7. 查找   8. 更改 *************\n");
    printf("***********       0. 退出     *************\n");
    printf("*******************************************\n");
    printf("请输入要进行的操作:");
}


enum Contact
{
    Exit,
    PushBack,
    PushHead,
    PopBack,
    PopHead,
    PushDesi,
    PopDesi,
    Find,
    Change,
};


int main()
{
    //TestPerInfo();
    SL per;
    PerInfoInit(&per);
    int input = 0;
    do
    {
        menu();
        scanf("%d", &input);
        int i = (enum Contact)input;
        switch (i)
        {
        case PushBack:
            PerInfoPushBack(&per);
            PerInfoPrint(&per);
            break;
        case PushHead:
            PerInfoPushHead(&per);
            PerInfoPrint(&per);
            break;
        case PopBack:
            PerInfoPopBack(&per);
            PerInfoPrint(&per);
            break;
        case PopHead:
            PerInfoPopHead(&per);
            PerInfoPrint(&per);
            break;
        case PushDesi:
            PerInfoPushDesi(&per);
            PerInfoPrint(&per);
            break;
        case PopDesi:
            PerInfoPopDesi(&per);
            PerInfoPrint(&per);
            break;
        case Find:
            PerInfoFind(&per);
            break;
        case Change:
            PerInfoChange(&per);
            PerInfoPrint(&per);
            break;
        case Exit:
            printf("退出程序\n");
            break;
        default:
            printf("输入非法,请重新输入\n");
            break;
        }

    } while (input);

    return 0;
}
 

                                                 

                                                  创作不易,点个赞呗,蟹蟹啦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/589385.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建电商网站外贸网站用API接口可以实现哪些功能(天猫API接口|京东API接口)

在电商领域&#xff0c;API接口可以实现多种功能&#xff0c;起到连接内外部系统及优化电商业务流程等多种作用&#xff0c;从而来提高电商企业的运营效率。 具体来看&#xff0c;API接口接入可以用来&#xff1a; 商品管理&#xff1a; API接口能够用来获取商品详情等&#…

收下这份地表最强参会指南,4月16日,玩转百度Create大会不迷路

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

如何处理Flutter内存泄漏检测和优化

处理Flutter内存泄漏问题是构建高性能、稳定的应用程序的关键部分之一。在本文中&#xff0c;我将详细介绍如何检测和优化Flutter内存泄漏问题&#xff0c;以确保应用程序的良好性能和用户体验。 1. 了解内存泄漏 在深入了解如何处理Flutter内存泄漏之前&#xff0c;首先需要了…

Lambda表达式,Stream流

文章目录 Lambda表达式作用前提函数式接口特点 语法省略模式和匿名对象类的区别 Stream流思想作用三类方法获取方法单列集合(Collection[List,Set双列集合Map(不能直接获取)数组同一类型元素(Stream中的静态方法) 常见的中间方法终结方法收集方法 Optional类 Lambda表达式 作用…

【nc工具信息传输】

nc&#xff0c;全名叫 netcat&#xff0c;它可以用来完成很多的网络功能&#xff0c;譬如端口扫描、建立TCP/UDP连接&#xff0c;数据传输、网络调试等等&#xff0c;因此&#xff0c;它也常被称为网络工具的 瑞士军刀 。 nc [-46DdhklnrStUuvzC] [-i interval] [-p source_po…

数控加工4轴初探

4轴加工之前一直觉得很神秘&#xff0c;最近画了些时间研究了一下&#xff0c;做过之后发现起始也不是特别复杂。 图中是两步&#xff0c;一步是粗开&#xff0c;已不是用指形铣刀精加工螺旋槽。

Flask Python:如何获取不同请求方式的参数

目录 前言 1. 获取GET请求中的查询参数 2. 获取POST请求中的表单数据 3. 获取JSON数据 总结 前言 在使用Flask开发Web应用时&#xff0c;我们经常需要获取不同请求方式的参数。Flask提供了多种方式来获取不同请求方式的参数&#xff0c;包括GET请求中的查询参数、POST请求…

EF数据持久化(三层架构,公司查,改)

效果图 Model设置具体流程在下面链接中 https://blog.csdn.net/Mr_wangzu/article/details/136805824?spm1001.2014.3001.5501 DAL using System; using System.Collections.Generic; using System.Linq; using System.Web; using WebApplication2.Models; namespace WebAppli…

LeetCode——动态规划(Java)

动态规划 简介[简单] 509. 斐波那契数[简单] 70. 爬楼梯[简单] 746. 使用最小花费爬楼梯[中等] 62. 不同路径[中等] 63. 不同路径 II[中等] 343. 整数拆分[中等] 96. 不同的二叉搜索树背包问题01背包[中等] 416. 分割等和子集[中等] 1049. 最后一块石头的重量 II[中等] 494. 目…

关于搭建电商独立站跨境电商接入主流电商平台API商品接口对于商品功能模块的巨大应用

功能设计 首先我们来看下mall项目中商品功能的设计&#xff0c;主要包括商品管理、添加\编辑商品、商品分类、商品类型、品牌管理等功能&#xff0c;这里的功能同时涉及前台商城和后台管理系统。 商品管理【接入主流电商平台商品API接口丰富自建商城商品】 在mall项目的后台管…

什么牌子的骨传导耳机值得入手?盘点五大业界公认靠谱品牌推荐!

骨传导耳机作为新型蓝牙耳机款式&#xff0c;凭借不入耳佩戴更健康等特点&#xff0c;赢得了消费者的喜欢&#xff0c;逐渐成为热门款式&#xff0c;但随着热度增加&#xff0c;骨传导耳机行业开始出现各种品牌&#xff0c;它们没有自己的核心技术&#xff0c;大部分都是来个韭…

算法沉淀——动态规划篇(子数组系列问题(上))

算法沉淀——动态规划篇&#xff08;子数组系列问题&#xff08;上&#xff09;&#xff09; 前言一、最大子数组和二、环形子数组的最大和三、乘积最大子数组四、乘积为正数的最长子数组长度 前言 几乎所有的动态规划问题大致可分为以下5个步骤&#xff0c;后续所有问题分析都…