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

这篇具有很好参考价值的文章主要介绍了【数据结构|C语言版】顺序表应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
上期回顾: 【数据结构|C语言版】顺序表
个人主页: C_GUIQU

前言

各位小伙伴大家好!上期小编给大家讲解了数据结构中的顺序表,接下来讲讲顺序表该如何应用。
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言

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 添加联系人

【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言

1.3.2 删除联系人

【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言

1.3.3 修改联系人

【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言

1.3.4 查找联系人

【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言

1.3.5 清空通讯录

【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言

1.3.6 通讯录读档和存档

【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言

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];
    }
}

结语

以上就是小编对顺序表应用的讲解。
如果觉得小编讲的还可以,还请一键三连。互三必回!
持续更新中~!
【数据结构|C语言版】顺序表应用,【数据结构(C语言版)学习】,数据结构,链表,c语言文章来源地址https://www.toymoban.com/news/detail-853116.html

到了这里,关于【数据结构|C语言版】顺序表应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言---数据结构实验---顺序表的合并---链表的基本操作---重点解析约瑟夫问题

    实验的写法多种多样,但本文并未采用 #define 定义容量的写法,这样写已经是很老旧过时的写法。所有实验主体采用均为动态开辟,后续如果利用 C++ 来写或许会应用更多语法… 本篇展示数据结构的两个实验 其中,重点分析约瑟夫问题 实验中代码的命名风格等均与下方博客

    2024年02月16日
    浏览(35)
  • 数据结构入门(C语言版)二叉树的顺序结构及堆的概念及结构实现应用

    普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用 顺序结构的数组来存储 ,需要注意的是 这里的堆和操作系统虚拟进程地址空间中的堆是两回事 ,一个是 数据结构 ,一

    2023年04月19日
    浏览(39)
  • 数据结构---顺序表,链表

    目录 前言 线性表 线性表的概念 顺序表 顺序表的概念 顺序表的结构 接口实现 相关面试题分析 顺序表的问题及思考 链表 链表的概念及结构 链表的分类 单链表的实现  接口实现  链表面试题 双向链表 顺序表和链表的区别         这篇文章主要讲顺序表和链表,有几点需要

    2024年02月16日
    浏览(25)
  • 【数据结构】顺序表和链表

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上

    2024年01月20日
    浏览(38)
  • 数据结构2:顺序表和链表

    目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 2.3数据相关面试题 2.4顺序表的问题及思考 3.链表 3.1链表的概念及结构 3.2链表的分类 3.3链表的实现 3.4链表面试题 3.5双向链表的实现 4.顺序表和链表的区别 线性表(linear list)是具有相同特征的数据元素的有限序列。线性表是

    2023年04月17日
    浏览(30)
  • 数据结构(二)----线性表(顺序表,链表)

    目录 1.线性表的概念 2.线性表的基本操作 3.存储线性表的方式 (1)顺序表 •顺序表的概念 •顺序表的实现 静态分配: 动态分配: 顺序表的插入: 顺序表的删除: 顺序表的按位查找: 顺序表的按值查找: 顺序表的特点: (2)单链表 •单链表的实现 不带头结点的单链表

    2024年04月16日
    浏览(44)
  • 《数据结构》实验报告二:顺序表 链表

    1、掌握线性表中元素的 前驱、后续 的概念。 2、掌握顺序表与链表的 建立 、 插入 元素、 删除 表中某元素的算法。 3、对线性表相应算法的 时间复杂度 进行分析。 4、理解顺序表、链表数据结构的特点( 优缺点 )。 说明以下概念 1、线性表:         具有 相同特性 的数

    2024年02月08日
    浏览(33)
  • 常见的数据结构(顺序表、顺序表、链表、栈、队列、二叉树)

    线性表(Linear List)     1.什么是线性表     2.线性表的特点     3.线性表的基本运算 顺序表     1.什么是顺序表     2.时间复杂度: 链表     1.什么是链表     2.单向链表     3. 双向链表     4.ArrayList和LinkedList的使用 栈Stack     1.什么是栈     2.栈的基本方法 队列Queue

    2024年02月13日
    浏览(29)
  • 数据结构中: 一元多项式的运算(相加,相减,相乘)------用C语言 / C++来实现。 数据结构线性表的操作和应用(顺序存储)

    线性表的操作和应用(顺序存储)。用顺序存储实现一元多项式,并进行加、减、乘运算。 (1)一元多项式结构体创建  (2)初始化 (3)一元多项式赋值             (4)打印一元多项式 (5)加法运算                        (6)减法运算 (7)乘法运算    全部代

    2024年02月01日
    浏览(41)
  • 数据结构,队列,顺序表队列,链表队列

            队列是一种常见的数据结构,它具有先进先出(First-In-First-Out,FIFO)的特性,类似于排队等候的场景。以下是队列的要点: 1. 定义:队列是一种线性数据结构,由一系列元素组成,可以进行插入和删除操作。插入操作(称为入队)只能在队列的末尾进行,删除操

    2024年02月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包