【数据结构|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 100
 
struct 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];
    }
}

结语

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day 41:动态规划 LeedCode 343. 整数拆分 96.不同的二叉搜索树

343. 整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 思路: 1.确定dp数组&#xff0…

支付系统核心逻辑 — — 状态机(JavaGolang版本)

支付系统核心逻辑 — — 状态机 代码地址&#xff1a;https://github.com/ziyifast/ziyifast-code_instruction/tree/main/state_machine_demo 1 概念&#xff1a;FSM&#xff08;有限状态机&#xff09;&#xff0c;模式之间转换 状态机&#xff0c;也叫有限状态机&#xff08…

OpenWrt 多拨负载均衡不起作用

检查 负载均衡->规则->Https->粘滞模式 是否启动&#xff0c;设置为 否 如果设置为是&#xff0c;那么根据官方描述&#xff1a; 来自相同源 IP 的流量&#xff0c;如果已经匹配过此规则并且在粘滞超时时间内&#xff0c;将会使用相同的 WAN 接口 意思就是如果你同一个…

R语言 并行计算makeCluster报错

问题&#xff1a;使用parallel包进行并行计算&#xff0c; cl <- makeCluster(detectCores()) 出现以下问题&#xff1a; 解决方式&#xff1a;用makeClusterPSOCK命令代替即可 library("future") cl <- makeClusterPSOCK(124, revtunnel TRUE, outfile &…

【QT入门】Qt自定义控件与样式设计之自定义QTabWidget实现tab在左,文本水平的效果

往期回顾 【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件-CSDN博客 【QT入门】Qt自定义控件与样式设计之鼠标相对、绝对位置、窗口位置、控件位置-CSDN博客【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框-CSDN博客 【QT入门】Qt自定义控件与样式…

(一)基于IDEA的JAVA基础16(end)

二维数组 二维数组就是数组里面再放一个数组 语法: <数据类型> [] [] 数组名&#xff1b; 或: <数据类型> 数组名 [] []&#xff1b; 比如这里有5个单位&#xff0c;每个单位员工有20个&#xff0c;他们都在忙几个相同的项目&#xff0c;现在要对某项项目进行操…

html、css、QQ音乐移动端静态页面,资源免费分享,可作为参考,提供InsCode在线运行演示

CSDN将我上传的免费资源私自变成VIP专享资源&#xff0c;且作为作者的我不可修改为免费资源&#xff0c;不可删除&#xff0c;寻找客服无果&#xff0c;很愤怒&#xff0c;&#xff08;我发布免费资源就是希望大家能免费一起用、一起学习&#xff09;&#xff0c;接下来继续寻找…

Linux进阶篇:centos7搭建jdk环境

Linux服务搭建篇&#xff1a;centos7搭建jdk环境 本文主要介绍的是如何是Linux环境下安装JDK的&#xff0c;关于jdk的概念就不做赘述了&#xff0c;相信大家都有所耳闻了&#xff0c;Linux环境下&#xff0c;很多时候也离不开Java的&#xff0c;下面笔者就和大家一起分享如何jd…

【数据结构|C语言版】单链表应用

前言1. 基于单链表实现通讯录1.1 知识要求1.2 功能要求 2. 代码总结2.1 SeqList.h2.2 SeqList.c2.3 Contact.h2.4 Contact.c2.5 test.c 后言 上期回顾&#xff1a;【数据结构|C语言版】单链表 前言 各位小伙伴大家好&#xff01;上期小编讲解了单链表相关知识&#xff0c;在此…

SpringCloudAlibaba真的不行了吗?

Spring Cloud Alibaba 作为SpringCloudAlibaba微服务架构实战派上下册和RocketMQ消息中间件实战派上下册的作者胡弦&#xff0c;我想和技术人聊一下&#xff0c;阿里巴巴开源的SpringCloudAlibaba真的不行了吗&#xff1f; 目前SpringCloudAlibaba最新的版本为2023.0.0.0-RC1 …

蓝桥杯2024年第十五届省赛

E:宝石组合 根据给的公式化简后变为gcd(a,b,c)根据算数基本定理&#xff0c;推一下就可以了 然后我们对1到mx的树求约数&#xff0c;并记录约数的次数&#xff0c;我们选择一个最大的且次数大于等3的就是gcd int mx; vector<int> g[N]; vector<int> cnt[N]; int…

flutter material中的Icon组件的IconData 查阅

查阅 https://fonts.google.com/icons?selectedMaterialSymbolsOutlined:expand_less:FILL0;wght300;GRAD0;opsz24&icon.platformandroidhttps://fonts.google.com/icons?selectedMaterialSymbolsOutlined:expand_less:FILL0;wght300;GRAD0;opsz24&icon.platformand…

Java的maven项目导入本地jar包的三种方式

一、使用本地jar包 在项目中创建一个lib文件夹&#xff0c;将想要使用的本地jar包放进去 然后直接在pom.xml中添加下列依赖&#xff08;项目协作推荐&#xff09; <dependency><groupId>com.fpl</groupId><artifactId>spring</artifactId><…

Linux下SPI设备驱动实验:验证SPI节点及ICM20608设备子节点

一. 简介 前一篇文章在设备树文件中创建了SPI的 IO 的 pinctrl节点&#xff0c;SPI节点及ICM20608设备子节点&#xff0c;文章如下&#xff1a; Linux下SPI设备驱动实验&#xff1a;创建SPI节点及SPI设备子节点-CSDN博客 本文对设备树文件进行加载测试&#xff0c;确定SPI节…

leetcode199 二叉树的右视图

题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 解析 这道题首先能想到的办法&#xff0c;就是使用迭代法层次遍历&…

部署项目的时候的一些错误

项目打jar包&#xff0c;找不到资源&#xff0c;连接不上数据库 项目打包后无法运行 直接在idea运行可以 解决方法&#xff1a;pom文件中增加&#xff08;配置文件如果是yml&#xff0c;写yml&#xff09; <resources><resource><directory>src/main/java&…

系统学c#:2、基础语法(关键字、标识符、数据类型、变量、常量、字面量、运算符、类型转换)

关键字&#xff1a; 关键字是编程语言中具有特殊含义的单词或符号&#xff0c;它们通常被编程语言用于表示特定的语法结构、操作或约定。在C#中&#xff0c;关键字具有特定的语法和功能&#xff0c;用于定义语言的基本结构和规则。 以下是一些C#中常用的关键字及其功能&#xf…

【计算机毕业设计】游戏售卖网站——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

MybatisPlus——自定义Sql

MybatisPlus——自定义Sql 自定义sql mybatisplus自定义sql并不是全部进行自定义的&#xff0c;我们可以利用MybatisPlus的Wrapper来构建复杂的Where条件&#xff0c;然后自己定义sql语句中剩下的部分。 自定义sql案例 以为例&#xff1a;将id在指定范围&#xff08;1&…

搜索树, 哈希表

目录 一. 搜索树 1.1 概念 1.2 操作1 查找 1.3 操作2 插入 1.4 操作3 删除 1.5 性能分析 1.6 和 java 类集的关系 二.哈希表 2.1 概念 2.2 哈希冲突 2.3常见哈希函数 2.4 负载因子 2.5 闭散列 2.6 开散列 2.7 哈希表的实现 push 添加数据 getVal() 获取key对应的v…