【数据结构|C语言版】顺序表应用

  • 前言
  • 1. 基于动态顺序表实现通讯录
    • 1.1 通讯录功能
    • 1.2 代码实现
      • 1.2.1 SeqList.h
      • 1.2.2 SeqList.c
      • 1.2.3 Contact.h
      • 1.2.4 Contact.c
      • 1.2.5 test.c
    • 1.3 控制台测试
      • 1.3.1 添加联系人
      • 1.3.2 删除联系人
      • 1.3.3 修改联系人
      • 1.3.4 查找联系人
      • 1.3.5 清空通讯录
      • 1.3.6 通讯录读档和存档
  • 2. 好题测验
    • 2.1 好题展示
    • 2.2 答案解析
  • 结语


在这里插入图片描述
上期回顾: 【数据结构|C语言版】顺序表
个人主页: C_GUIQU

前言

各位小伙伴大家好!上期小编给大家讲解了数据结构中的顺序表,接下来讲讲顺序表该如何应用。
在这里插入图片描述

1. 基于动态顺序表实现通讯录

1.1 通讯录功能

(1)能够保存联系人的姓名、年龄、性别、电话、住址

(2)添加联系人信息

(3)删除联系人信息

(4)修改联系人信息

(5)查找联系人信息

(6)查看通讯录中所有联系人信息

(7)清空通讯录

(8)每次加载通讯录时自动载入历史通讯录,退出通讯录后自动保存通讯录信息

1.2 代码实现

1.2.1 SeqList.h

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <Windows.h>
#include "Contact.h"typedef Info SLDataType; //顺序表元素种类为存放个人信息的结构体typedef struct SeqList
{SLDataType* a;size_t size;size_t capicity;
} SeqList;// 顺序表初始化
void SeqListInit(SeqList* psl);
// 检查空间,如果满了,进行增容
void CheckCapacity(SeqList* psl);
// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos);
// 顺序表销毁
void SeqListDestory(SeqList* psl);

1.2.2 SeqList.c

#include "SeqList.h"void SeqListDestory(SeqList* psl)
{assert(psl);free(psl->a);psl->a = NULL;psl->capicity = 0;psl->size = 0;
}void SeqListInit(SeqList* psl)
{assert(psl);psl->a = (SLDataType*)malloc(sizeof(SLDataType) * 4);if (psl->a == NULL){perror("malloc fail");return;}psl->size = 0;psl->capicity = 4;
}void CheckCapacity(SeqList* psl)
{assert(psl);if (psl->size == psl->capicity){SLDataType* tmp = (SLDataType*)realloc(psl->a, sizeof(SLDataType) * psl->capicity * 2);if (tmp == NULL){perror("realloc fail");return;}psl->a = tmp;psl->capicity *= 2;}
}void SeqListPushBack(SeqList* psl, SLDataType x)
{assert(psl);CheckCapacity(psl);psl->a[psl->size++] = x;
}void SeqListErase(SeqList* psl, size_t pos)
{assert(psl);assert(0 <= pos && pos < psl->size);while (pos < psl->size - 1){psl->a[pos] = psl->a[pos + 1];pos++;}psl->size--;
}

1.2.3 Contact.h

#pragma once#define NAME_MAX 100
#define GENDER_MAX 10
#define TEL_MAX 11
#define ADDR_MAX 100struct SqeList; 
//因为这里不能声明SeqList.h,不然会造成嵌套声明,所以就单独声明一下顺序表typedef struct SeqList contact;
//要实现的是通讯录,所以得把顺序表换个名,但换汤不换药typedef struct PersonInfo
{char name[NAME_MAX];      //姓名int age;                  //年龄char gender[GENDER_MAX];  //性别char telephone[TEL_MAX];  //电话char address[ADDR_MAX];   //住址
}Info;void InitContact(contact* pcon);//初始化通讯录void DestoryContact(contact* pcon);//销毁通讯录int FindByName(contact* pcon, char* name);//通过姓名查找联系人void AddContact(contact* pcon);//添加联系人void DelContact(contact* pcon);//删除联系人void ModifyContact(contact* pcon);//修改联系人信息void FindContact(contact* pcon);//查找联系人void ShowContact(contact* pcon);//展示联系人列表void ClearContact(contact* pcon);//清空通讯录void SaveContact(contact* pcon);//保存通讯录void LoadContact(contact* pcon);//载入历史通讯录

1.2.4 Contact.c

#include "SeqList.h"void InitContact(contact* pcon)//初始化通讯录
{SeqListInit(pcon);
}void DestoryContact(contact* pcon)//销毁通讯录
{SeqListDestory(pcon);
}int FindByName(contact* pcon, char* name)//通过姓名查找联系人
{for (size_t i = 0; i < pcon->size; i++){if (strcmp(name, pcon->a[i].name) == 0){return i;}}return -1;
}void AddContact(contact* pcon)//添加联系人
{CheckCapacity(pcon);printf("请输入姓名:\n");scanf("%s", pcon->a[pcon->size].name);printf("请输入年龄:\n");scanf("%d", &(pcon->a[pcon->size].age));printf("请输入性别:\n");scanf("%s", pcon->a[pcon->size].gender);printf("请输入电话:\n");scanf("%s", pcon->a[pcon->size].telephone);printf("请输入住址:\n");scanf("%s", pcon->a[pcon->size].address);pcon->size++;system("cls");printf("添加成功!\n");
}void DelContact(contact* pcon)//删除联系人
{char name[100];printf("请输入要删除的联系人:\n");scanf("%s", name);int index = FindByName(pcon, name);if (index == -1){printf("要删除的用户不存在!\n");return;}SeqListErase(pcon, index);system("cls");printf("删除成功!\n");
}void ModifyContact(contact* pcon)//修改联系人信息
{char name[100];printf("请输入要修改的联系人:\n");scanf("%s", name);int index = FindByName(pcon, name);if (index == -1){printf("要修改的用户不存在!\n");return;}printf("请输入修改后的姓名:\n");scanf("%s", pcon->a[index].name);printf("请输入修改后的年龄:\n");scanf("%d", &(pcon->a[index].age));printf("请输入修改后的性别:\n");scanf("%s", pcon->a[index].gender);printf("请输入修改后的电话:\n");scanf("%s", pcon->a[index].telephone);printf("请输入修改后的住址:\n");scanf("%s", pcon->a[index].address);system("cls");printf("修改成功!\n");
}void FindContact(contact* pcon)//查找联系人
{char name[100];printf("请输入要查找的联系人:\n");scanf("%s", name);int index = FindByName(pcon, name);if (index == -1){printf("要查找的用户不存在!\n");return;}system("cls");printf("查找成功!\n");printf("姓名:%s\n", pcon->a[index].name);printf("年龄:%d\n", pcon->a[index].age);printf("性别:%s\n", pcon->a[index].gender);printf("电话:%s\n", pcon->a[index].telephone);printf("住址:%s\n", pcon->a[index].address);
}void ShowContact(contact* pcon)//展示联系人列表
{if (pcon->size == 0){printf("通讯录为空!\n");return;}printf("姓名 年龄 性别 电话 地址\n");for (size_t i = 0; i < pcon->size; i++){printf("%s %d %s %s %s\n",pcon->a[i].name,pcon->a[i].age,pcon->a[i].gender,pcon->a[i].telephone,pcon->a[i].address);}
}void ClearContact(contact* pcon)//清空通讯录
{pcon->size = 0;printf("通讯录清空成功!\n");
}void SaveContact(contact* pcon)//保存通讯录
{FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("fopen fail");return;}for (size_t i = 0; i < pcon->size; i++){fwrite(pcon->a + i, sizeof(Info), 1, pf);}printf("通讯录数据保存成功!\n");fclose(pf);
}void LoadContact(contact* pcon)//载入历史通讯录
{FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("fopen fail");return;}Info info;while (fread(&info, sizeof(Info), 1, pf)){SeqListPushBack(pcon, info);}printf("通讯录数据载入成功!\n");fclose(pf);
}

1.2.5 test.c

#include "SeqList.h"void Menu()
{printf("****************通讯录******************\n");printf("****** 1.添加联系人  2.删除联系人 ******\n");printf("****** 3.修改联系人  4.查找联系人 ******\n");printf("****** 5.查看通讯录  6.清空通讯录 ******\n");printf("****** 0.退出通讯录               ******\n");printf("****************************************\n");
}int main()
{contact con;InitContact(&con); //初始化通讯录LoadContact(&con); //加载历史通讯录int option = -1;do {Menu();printf("请选择:\n");scanf("%d", &option);system("cls"); //适当的清屏看起来更简洁switch (option){case 1://添加联系人AddContact(&con);break;case 2://删除联系人DelContact(&con);break;case 3://修改联系人ModifyContact(&con);break;case 4://查找联系人FindContact(&con);break;case 5://查看通讯录ShowContact(&con);break;case 6://清空通讯录ClearContact(&con);break;case 0://退出通讯录printf("通讯录退出中...\n");break;default:printf("非法操作,请重新输入\n");break;}} while (option);SaveContact(&con); //保存通讯录DestoryContact(&con); //销毁通讯录return 0;
}

1.3 控制台测试

1.3.1 添加联系人

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3.2 删除联系人

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3.3 修改联系人

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3.4 查找联系人

在这里插入图片描述
在这里插入图片描述

1.3.5 清空通讯录

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3.6 通讯录读档和存档

在这里插入图片描述
在这里插入图片描述

2. 好题测验

2.1 好题展示

【经典算法OJ题1|移除元素】

【经典算法OJ题2|合并两个有序数组】

2.2 答案解析

【移除元素】

int removeElement(int* nums, int numsSize, int val) 
{int left = 0;for(int right = 0; right < numsSize; right++){if(nums[right] != val){nums[left] = nums[right];left++;}}  return left;
}

【合并两个有序数组】

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{int p1 = 0, p2 = 0;int sorted[m + n];int cur;while (p1 < m || p2 < n) {if (p1 == m) {cur = nums2[p2++];} else if (p2 == n) {cur = nums1[p1++];} else if (nums1[p1] < nums2[p2]){cur = nums1[p1++];} else {cur = nums2[p2++];}sorted[p1 + p2 - 1] = cur;}for (int i = 0; i != m + n; ++i) {nums1[i] = sorted[i];}
}

结语

以上就是小编对顺序表应用的讲解。
如果觉得小编讲的还可以,还请一键三连。互三必回!
持续更新中~!
在这里插入图片描述

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

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

相关文章

Netty 心跳(heartbeat)——服务源码小结(四十三)

ldleStateHandler 可以实现心跳功能&#xff0c;当服务器和客户端没有任何读写交互时&#xff0c;并超过了给定的时间&#xff0c;则会触发用户 handler 的 userEventTriggered 方法。用户可以在这个方法中尝试向对方发送信息&#xff0c;如果发送失败&#xff0c;则关闭连接。…

Java SPI机制详解

Java SPI机制详解 1、什么是SPI&#xff1f; SPI 全称为 (Service Provider Interface) &#xff0c;是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制&#xff0c; 比如有个接口&#xff0c;想运行时动态的给它添加实现&#xff0c;你只需要添加一个实现。我们…

力学笃行(五)Qt QWidgets类

Qt QWidgets类 QDockWidgetQDockWidget与QToolBar&#xff1a;QDockWidget与QMenuBar&#xff1a; QDockWidget QDockWidget属于Qt的窗口部件&#xff08;Widgets&#xff09;模块&#xff0c;这个模块提供了一组用于构建图形用户界面&#xff08;GUI&#xff09;的基本控件和…

Linux下SPI设备驱动实验:SPI设备驱动框架编写

一. 简介 Linux下的SPI 驱动框架和 I2C 很类似&#xff0c;都分为主机控制器驱动和设备驱动&#xff0c;SPI主机控制器是半导体厂商编写的&#xff0c;我们只需要编写 SPI设备驱动代码。 本实验的最终目的就是驱动 I.MX6ULL-ALPHA 开发板上的 ICM-20608 这个 SPI 接口的六轴…

B端:导航条长得不都一样吗?错了,这里看过来就懂了。

B端导航条看似都一样&#xff0c;大差不差&#xff0c;仔细看一下&#xff0c;其实各有各的不同&#xff0c;这里方向了十多个&#xff0c;大家仔细看细节。

avicat连接异常,错误编号2059-authentication plugin…

错误原因为密码方式不对&#xff0c;具体可自行百度 首先管理员执行cmd进入 mysql安装目录 bin下边 我的是C:\Program Files\MySQL\MySQL Server 8.2\bin> 执行 mysql -u -root -p 然后输入密码 123456 进入mysql数据库 use mysql 执行 ALTER USER rootlocalhost IDE…

关于沃进科技无线模块demo软件移植问题

文章目录 一、无线模块开发测试准备二、开发板硬件三、开发板默认功能上电默认界面功能选择界面数据包发送界面数据包接收显示界面射频性能测试界面参数设置界面固件信息显示界面 四、软件开发软件SDK框图1、射频硬件驱动&#xff08;详见./radio/myRadio_gpio.c&#xff09;2、…

51单片机实验04 -数码管的动态显示实验

目录 一、实验目的 二、实验内容 三、实验原理 四、实验方法 五&#xff0c;实验效果及代码 1&#xff0c;效果 2&#xff0c;代码 六&#xff0c;课后习题 1&#xff0c;使用定时器T0的中断函数1 从999999~0计时 1&#xff09;效果 2&#xff09;代码 2&#xff0c…

配置linux的oracle 21c启停服务

一、配置启停 1、使用root用户登陆 su - root 2、修改oratab文件 修改oratab文件&#xff0c;将红框里面的N改为“Y”&#xff0c;使启停脚本能够生效 vi /etc/oratab 3、验证 配置好后就能够使用 dbshut 停止服务 和 dbstart 启动服务 了 2.1启动服务 su - oracle dbstart…

什么是线程?线程和进程谁更弔?

第一个参数是所创建进程的pid。 第二个是线程的属性。 第三个参数是返回值为void*&#xff0c;参数也为void*的函数指针。 第四个参数是给第三个参数的参数&#xff0c;也就是给给函数传参。 #include<iostream> #include<pthread.h> #include<unistd.h>…

折叠面板组件(vue)

代码 <template><div class"collapse-info"><div class"collapse-title"><div class"title-left">{{ title }}</div><div click"changeHide"> <Button size"small" v-if"sho…

生产计划和排单管理怎么做

阅读本文&#xff0c;你将了解到&#xff1a;1、企业是如何制定生产计划和进行排单管理&#xff1f; 2.企业在执行生产计划和进行排单管理过程中会遇到那些问题&#xff1f; 3.企业如何高效利用工具去解决问题&#xff1f; 一、生产计划和排单管理是什么 1.生产计划和排单管理…

【uniapp】【uview2.0】【u-sticky】Sticky 吸顶

把pages.json文件中的 “navigationStyle"设置为"custom”, 出现的问题是&#xff0c;莫名奇妙多了个 一个高度 解决方法 /* 使用CSS的sticky定位 */ .sticky {/* #ifdef H5 */ position: -webkit-sticky;position: sticky;top: 0; /* 设置距顶部的距离 */z-ind…

[Python开发问题] Selenium ERROR: Unable to find a matching set of capabilities

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

在Spring Boot实战中碰到的拦截器与过滤器是什么?

在Spring Boot实战中&#xff0c;拦截器&#xff08;Interceptors&#xff09;和过滤器&#xff08;Filters&#xff09;是两个常用的概念&#xff0c;它们用于在应用程序中实现一些通用的逻辑&#xff0c;如日志记录、权限验证、请求参数处理等。虽然它们都可以用于对请求进行…

最大子树和(遇到的题)

题目是给出一个树&#xff0c;求其中最大的权值块 题解&#xff1a; #include <bits/stdc.h> using namespace std; const int N1e59; int dp[N]; //dp[i]表示第i结点为根最大权值 int w[N]; //记录每个结点的权值 int n; //点的数量 int t; //样例个数 …

Ubuntu安装VMVare Workstation pro 17.5.1

由于需要装Kali&#xff0c;我电脑是Ubuntu单系统&#xff0c;所以只能使用linux版本的虚拟机&#xff0c;通过这种方式来安装虚拟机和Kali镜像。 参考CSDN博客资料&#xff1a;https://blog.csdn.net/xiaochong0302/article/details/127420124 github代码资料&#xff1a;vm…

力扣:383题. 赎金信

题目&#xff1a; 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串&#xff0c;判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成&#xff0c;返回 true &#xff1b;否则返回 false。 (题目说明&#xff1a;为了不暴露赎金…

程序运行在 STM32H750 的外扩 FLASH 上两小时后死机

1. 问题现象 客户使用 STM32H750VBT6&#xff0c;通过 QSPI 外扩了一个 4M 的 NOR FLASH&#xff0c;采用memory map 模式。当程序跳转运行到外设 FLASH 后&#xff0c;大约两个小时后程序死机。 客户使用的 IDE 是 KEIL&#xff0c;此问题可以固定重现。 在 KEIL 调试模式下…

triton入门实战

这篇文章主要讲的是基于官方镜像及&#xff0c; pytorch script 格式模型&#xff0c;构建tritonserver 服务 1、环境准备&#xff1a; 1.1. 下载 tritonserver镜像&#xff1a; Triton Inference Server | NVIDIA NGC a. 注意&#xff1a;tritonserver 镜像中的invdia驱动版本…