数据结构之顺序表(创建、使用、销毁)

2023-11-01

顺序表是在计算机内存中采用顺序存储的方式存储的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。顺序表的物理结构和逻辑结构都是连续的。顺序表的增删操作麻烦,需要移动的元素可能很多,修改和查找操作方便,通过下标访问,访问速度快。

下面,我将实现顺序表的创建、使用和删除。(包含头文件与源文件)

头文件:SeqList.h

#ifndef __SEQLIST_H__

#define __SEQLIST_H__
#define INIT_SIZE 10
#define INCRESS_SIZE 20
#define FALSE 0
#define TRUE  1

typedef int SeqData;
// 顺序表结构
typedef struct _SeqList
{
	SeqData * list;         // 指向存储空间的指针
	SeqData max_len;       // 保存存储空间最大长度
	SeqData len;         // 保存当前使用的长度
}SeqList;

// 创建顺序表
SeqList *Create_List();

// 销毁顺序表
void Destory(SeqList *s);

// 插入数据:尾插法
int Insert_Last(SeqList *s,SeqData data);

// 插入数据:头插法
int Insert_Head(SeqList *s,SeqData data);

// 插入数据:在下标为 pos 的位置插入数据
int Insert_Pos(SeqList *s,int pos,SeqData data);

//获得下标pos的元素的值
int GetData(SeqList *s,int pos,SeqData *x);

// 查找元素,如果找到,将该元素的下标给x
int FindData(SeqList *s, SeqData data, SeqData *x);

// 删除 pos 下标的元素
int Delete_Pos(SeqList *s, int pos);

// 删除指定数据
int Delete_Data(SeqList *s, SeqData data);

//修改顺序表中所有值为data1的元素的值为data2
int Update_Data(SeqList *s,SeqData data1,SeqData data2);

//修改顺序表中下标为pos的元素的值为data
int Update_Pos(SeqList *s,int pos,SeqData data);

// 逆序顺序表
int Reverse_List(SeqList *s);

//将一张顺序表排序
int Order_List(SeqList *s);

//合并两张顺序表,合并后的表要求是从小到大排列的,函数返回新表的指针
SeqList * Merge_Order_List(SeqList *s1,SeqList *s2);

// 合并两张从小到大的有序顺序表,合并后的表要求是从小到大排列的,函数返回新表的指针
SeqList * Merge_List(SeqList *s1,SeqList *s2);

//打印顺序表
void Display(SeqList *s);
#endif

源文件:SeqList.c

#include <stdlib.h>
#include "SeqList.h"
#include <stdio.h>

// 创建顺序表
SeqList *Create_List()
{
	SeqList *s = (SeqList *)malloc(sizeof(SeqList)/sizeof(char));
	if (s == NULL)
	{
		return NULL;
	}
	s -> list = (SeqData *)malloc(sizeof(SeqData)/sizeof(char)*INIT_SIZE);
	if (s -> list == NULL)
	{
		free(s);
		return NULL;
	}
	s -> max_len = INIT_SIZE;
	s -> len = 0;

	return s;
}

// 销毁顺序表
void Destory (SeqList *s)
{
	if (s == NULL)
	{
		return;
	}
	free (s -> list);
	free (s);
}

//扩大顺序表的长度
int AgainMalloc (SeqList *s)
{
	if (s == NULL)
	{
		return FALSE;
	}
	SeqData newsize = sizeof(SeqData)/sizeof(char)*(INIT_SIZE + INCRESS_SIZE);
	SeqData *tmp = (SeqData *)realloc(s -> list,newsize);
	if (tmp == NULL)
	{
		return FALSE;
	}	
	s -> list = tmp;
	s -> max_len += INCRESS_SIZE;
	return TRUE;	
}

// 插入数据:尾插法
int Insert_Last(SeqList *s,SeqData data)
{
	if (s == NULL)
	{
		return FALSE;
	}
	if (s -> max_len == s -> len)
	{
		if(AgainMalloc(s) == FALSE)
		{
			return FALSE;
		}
	}
	s -> list[s -> len] = data;
	s -> len ++;
	return TRUE;
}

// 插入数据:头插法
int Insert_Head(SeqList *s,SeqData data)
{
	if (s == NULL)
	{
		return FALSE;
	}
	if (s -> max_len == s -> len)
	{
		if(AgainMalloc (s) == FALSE)
		{
			return FALSE;
		}
	}
	int i;
	for (i = s -> len -1;i >= 0;i--)
	{
		s -> list[i + 1] = s -> list[i];
	}
	s -> list[0] = data;
	s -> len ++;
	return TRUE;
}

// 插入数据:在下标为 pos 的位置插入数据
int Insert_Pos(SeqList *s,int pos,SeqData data)
{
	if (s == NULL || pos < 0 || pos > s -> len)
	{
		return FALSE;
	}
	if (s -> max_len == s -> len)
	{
		if(AgainMalloc (s) == FALSE)
		{
			return FALSE;
		}
	}
	s -> list[pos] = data;
	s -> len ++;
	return TRUE;
}

//获得下标pos的元素的值
int GetData(SeqList *s,int pos,SeqData *x)
{
	if (s == NULL || pos < 0 || pos >= s -> len || x == NULL)
	{
		return FALSE;
	}
	*x = s -> list[pos];
	return TRUE;
}

// 查找元素,如果找到,将该元素的下标给x
int FindData(SeqList *s, SeqData data, int *x)
{
	if (s == NULL || x == NULL)
	{
		return FALSE;
	}
	int i = 0;
	int count = 0;
	while (i < s -> len)
	{
		if (data == s -> list[i])
		{
			x[count] = i;
			count++;
		}
		i++;
	}
	x[count] = -1;
	if (count)
	{
		return TRUE;
	}
	return FALSE;
}

// 删除 pos 下标的元素
int Delete_Pos(SeqList *s, int pos)
{
	if (s == NULL || pos < 0 || pos >= s -> len)
	{
		return FALSE;
	}
	while(pos < s -> len)
	{
		s -> list[pos] = s -> list[pos++ + 1];
	}
	s -> len--;
	return TRUE;
}

// 删除指定数据
int Delete_Data(SeqList *s, SeqData data)
{
	if (s == NULL)
	{
		return FALSE;
	}	
	int index[s -> len];
	if (FindData(s,data,index) == FALSE)
	{
		return FALSE;
	}
	else
	{
		int i = 0;
		while (index[i] > -1)
		{
			Delete_Pos(s,index[i] - i++);
		}
	}
	return TRUE;
}

//修改顺序表中所有值为data1的元素的值为data2
int Update_Data(SeqList *s,SeqData data1,SeqData data2)
{
	if (s == NULL)
	{
		return FALSE;
	}
	int index[s -> len];
	if (FindData(s,data1,index) == FALSE)
	{
		return FALSE;
	}
	else
	{
		int i = 0;
		while (index[i] > -1)
		{
			s -> list[index[i++]] = data2;
		}		
	}
	return TRUE;
}

//修改顺序表中下标为pos的元素的值为data
int Update_Pos(SeqList *s,int pos,SeqData data)
{
	if (s == NULL || pos < 0 || pos >= s -> len)
	{
		return FALSE;
	}
	s -> list[pos] = data;
	return TRUE;
}

// 逆序顺序表
int Reverse_List(SeqList *s)
{
	if (s == NULL)
	{
		return FALSE;
	}
	int min = 0;
	int max = s -> len - 1;
	SeqData tmp;
	while (min < max)
	{
		tmp = s -> list[min];
		s -> list[min++] = s -> list[max];
		s -> list[max--] = tmp;
	}
	return TRUE;
}

//将一张顺序表排序
int Order_List(SeqList *s)
{
	if (s == NULL)
	{
		return FALSE;
	}
	int i,j;
	SeqData tmp;
	for (i = 0; i < s -> len - 1 ; i++)
	{
		for (j = 0; j < s -> len - 1 - i ; j++)
		{
			if (s -> list[j] > s -> list[j + 1])
			{
				tmp = s -> list[j];
				s -> list[j] = s -> list[j + 1];
				s -> list[j + 1] = tmp;
			}
		}
	}
	return TRUE;
}

//合并两张顺序表,合并后的表要求是从小到大排列的,函数返回新表的指针
SeqList * Merge_Order_List(SeqList *s1,SeqList *s2)
{
	if (s1 == NULL ||s2 == NULL)
	{
		return NULL;
	}
	SeqList *s3 = (SeqList *)malloc(sizeof(SeqList)/sizeof(char));
	if (s3 == NULL)
	{
		return NULL;
	}
	SeqData newsize = s1 -> len + s2 -> len;
	s3 -> list = (SeqData *)malloc(sizeof(SeqData)/sizeof(char)*newsize);
	if (s3 -> list == NULL)
	{
		free(s3);
		return NULL;
	}
	s3 -> max_len = newsize;
	s3 -> len = newsize;
	int i = 0;
	int j = 0;
	int k = 0;
	while(i < s1 -> len)
	{
		s3 -> list[k++] = s1 -> list[i++];
	}
	while(j < s2 -> len)
	{
		s3 -> list[k++] = s2 -> list[j++];
	}
	Order_List(s3);
	return s3;
}

// 合并两张从小到大的有序顺序表,合并后的表要求是从小到大排列的,函数返回新表的指针
SeqList * Merge_List(SeqList *s1,SeqList *s2)
{
	if (s1 == NULL ||s2 == NULL)
	{
		return NULL;
	}
	SeqList *s3 = (SeqList *)malloc(sizeof(SeqList)/sizeof(char));
	if (s3 == NULL)
	{
		return NULL;
	}
	SeqData newsize = s1 -> len + s2 -> len;
	s3 -> list = (SeqData *)malloc(sizeof(SeqData)/sizeof(char)*newsize);
	if (s3 -> list == NULL)
	{
		free(s3);
		return NULL;
	}
	s3 -> max_len = newsize;
	s3 -> len = newsize;
	int i = 0;
	int j = 0;
	int k = 0;
	while (i < s1 -> len && j < s2 -> len)
	{
		if (s1 -> list[i] < s2 -> list[j])
		{
			s3 -> list[k++] = s1 -> list[i++];
		}
		else
		{
			s3 -> list[k++] = s2 -> list[j++];
		}
	}
	while(i < s1 -> len)
	{
		s3 -> list[k++] = s1 -> list[i++];
	}
	while(j < s2 -> len)
	{
		s3 -> list[k++] = s2 -> list[j++];
	}
	return s3;
}

//打印顺序表
void Display(SeqList *s)
{
	if (s == NULL)
	{
		return;
	}
	int i;
	for (i = 0;i < s -> len;i++)
	{
		if (i % 4 == 0)
		{
			printf ("\n");
		}
		printf ("%8d",s -> list[i]);
	}
	printf ("\n");
}

关于顺序表的更多的功能,可以大家一起去实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构之顺序表(创建、使用、销毁) 的相关文章

  • 多中机器学习模型对比可视化

    传统的机器学习模型的选择往往是凭借经验和习惯 部分人一般情况会用TPOT今天最佳模型调参 但是也许要对比其他模型在哪些模型衡量指标下的优劣势 这里提供一个简单的效果对比工具 import matplotlib pyplot as plt m

随机推荐

  • 数睿通2.0数据中台数据资产、数据集市功能发布

    引言 数睿通 2 0 数据中台迎来了 7 月份的首次更新 本次更新主要是添加了数据资产 数据集市的相关核心功能 完整的功能实现尚需要时间打磨 因为最近工作实在是有些繁忙 琐事也多 所以能投入开发的时间着实有限 只实现了部分功能 通过数据资产
  • 路由器安装cloudflared进行内网穿透,安全访问内网

    文章目录 前言 一 Cloudflare Argo Tunnel是什么 二 使用步骤 1 开始准备 https developers cloudflare com cloudflare one setup 2 创建隧道 https deve
  • Win10系统下VisualStudio2019编译配置LAStools-v2.0.0

    目录 一 概述 1 LAStools v2 0 0 2 下载解压 二 源码编译 2 1 打开 2 2 移除加载失败的项目 2 3 修改代码 2 4 配置管理器 2 5 修改输出目录 2 6 修改头文件目录 2 7 修改运行库 2 8 生成l
  • matlabplot———散点图

    散点图 散点图 散点图的分类 散点图的优势 绘制散点图 散点图 散点图是指在回归分析中 数据点在直角坐标系平面上的分布图 散点图表示因变量随自变量而变化的大致趋势 在数据分析可视化时 一般会先绘制散点图 初步了解自变量和应变量之间的关系 通
  • wsl2安装archlinux

    前提 开启了WSL 虚拟平台 有WSL2内核 可以开启WSL2 下载Archlinux镜像 镜像名称archlinux bootstrap 2022 01 01 x86 64 tar gz 推荐到清华镜像站下载 下载LxRunOffline
  • 四.在centos上搭建Jira管理工具

    打开虚拟机并点击启动 再打开finalshell双击连接 打开navicat12 方法一 再在下载包里打开 1 下载配置jira 先进入根目录cd 创建两个文件mkdir software mkdir jiradata 进入software
  • jsp 页面编码优先级

    优先级如上图 另外贴一张之前的图
  • Ubantu——Linux文件解压和压缩

    Linux文件压缩和解压指令 一 gzip和gunzip 二 tar命令 三 tar解压和查看 压缩形式介绍 一 gzip和gunzip 例如 二 tar命令 使用区别如下 三 tar解压和查看 tar xvf 加上要解压的文件名字
  • 关于React项目中百度地图API的使用

    一 前言 1 首先进入百度地图API官方地址https lbsyun baidu com 选择适合自己项目的开发文档 我这次使用的是Javascript API 2 点击开发指南 gt Hello World 会有详细步骤介绍使用流程 按步
  • 牛客刷题 数组求和

    在leetcode上刷到第一题 又在牛客上刷到与第一题相似的第二 第三题 整理如下 第一题 给定一个整数数组 nums 和一个目标值 target 请你在该数组中找出和为目标值的那 两个 整数 并返回他们的数组下标 解题思路 public
  • 手机功能测试主要测哪些方面?

    1 RF收发信机指标测试 测试发射功率 发射频谱 接收灵敏度等等 2 音频指标测试 检查或测试发送音频灵敏度 振铃响度 受话器响度 失真度 侧音 免提功能等等 3 LCD和菜单功能的检查 看是否与说明书中所述内容相一致 4 各按键触觉和力度
  • docker基础:把容器做成镜像

    安装 Lua 语言环境 apt get update y apt get install y luajit luarocks 再用 exit 命令退出容器 再运行 docker commit 命令 docker commit a44444a
  • Apache优化

    Apache优化 Apache优化 系统层面优化 内核调试 关闭一些不必要运行的服务 或者删除一些不需要的用户 软件优化 Apache Tomcat Nginx Mysql Apache优化 工作模式 1 worker 单进程多线程 是和并
  • docker安装启动es

    原文链接 docker安装启动es 走看看 docker安装es和kibana docker pull elasticsearch 7 4 2 docker pull kibana 7 4 2 创建映射文件夹 并写入配置 mkdir p k
  • ShaderToy入门初体验

    ShaderToy入门初体验 前言 shadertoy https www shadertoy com 那些大神写的demo简直太震撼了 官方给出的how to 第一个程序 点击上图中的 新建 弹出下图界面 代码详解 void mainIm
  • table树形结构,获取一个节点的所有父节点

    判断叶子节点的所有父节点 function scheduleAlgorithm array 树形数据 value 根据该值判断找哪个节点的父节点 valueName fsecid 与上一节点相关联的值的字段名 childrenName ch
  • 【无人自主系统】自主系统自主性(持续更新内容中)

    事实上 过去当我们考虑地面 空中 水下无人设备的时候 我们考虑的是一个个子系统的自动化 传统意义上 自动化的定义是 系统或者设备在没有或者很少人工的参与下 完成特定操作 达成预期目的 广义的自动化涵盖执行逻辑操作的软件及其他应用过程 这也是
  • 不需要PS也能生成淘宝我的订单页面截图

    不知道大家有没有遇到这样的情况 在发微博 发朋友圈或者写博客的时候 想要分享购物心得 但却苦恼于找不到虚拟淘宝订单截图 别担心 今天我就来教大家一个轻松又快捷的方法 使用淘宝订单生成器 无需PS 虚拟淘宝订单在线生成工具 https tao
  • C语言循环结构

    目录 循环结构 while循环 基本while循环 do while循环 for循环 跳转语句 break continue goto 单纯的循环的常规操作 循环嵌套 循环嵌套的问题 作业 经典问题 百鸡百钱 经典问题 斐波拉契数列 循环结
  • 数据结构之顺序表(创建、使用、销毁)

    顺序表是在计算机内存中采用顺序存储的方式存储的线性表 是指用一组地址连续的存储单元依次存储数据元素的线性结构 顺序表的物理结构和逻辑结构都是连续的 顺序表的增删操作麻烦 需要移动的元素可能很多 修改和查找操作方便 通过下标访问 访问速度快