【数据结构与算法(C语言)】1. 线性表的顺序存储

news2024/11/26 23:48:39

文章目录

  • 前言
  • 一. 线性表插入和删除
    • 1. 元素的插入
    • 2. 元素的删除
  • 二. 代码
  • 三. 优缺点

前言

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据结构

一. 线性表插入和删除

1. 元素的插入

在这里插入图片描述
插入位置之后的数据都向后移一位,上图中元素98、208、999、789都向后移一位。元素666插入到第5个位置。

2. 元素的删除

在这里插入图片描述
待删除元素之后所有的元素都向前移一位,上图中,元素209,999,789都向前移一位

二. 代码

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

#define OK 	1
#define ERROR 	0
#define TRUE	1
#define	FALSE	0

#define LIST_INIT_SIZE 	20 	/*	线性表初始空间	*/
#define LIST_INCREMENT	10      /*	线性表每次的扩展空间大小 */

typedef int Status;	/*	状态码,函数返回的状态码 */
typedef int ElemType;	/*	元素类型,根据需要可以任意修改ElemType的原始类型,此处使用int型	*/

typedef struct 
{
	ElemType* elem ;	/*线性表数据, 使用数组实现顺序存储线性表的数据 */
	int length;		/*线性表长度*/
	int listSize;
} SqList;

Status InitList(SqList * list);		/*初始化线性表list*/
void DestoryList(SqList * list);		/*销毁线性表list*/
void ClearList(SqList * list);		/*清空线性表list*/
Status ListEmpty(SqList list);		/*判断线性表是否为空表,空表返回TRUE,非空返回FALSE*/
int ListLength(SqList list);		/*返回list的元素个数*/
Status GetElem(SqList list,int i, ElemType * elemPtr);	/*从list中获取第i个元素,并将获取到的元素放到 elemPtr指针中,
							  获取到返回OK,否则返回ERROR */
int LocateElem(SqList list,ElemType elem);		/*在list中查找数据元素elem的位置*/

Status PriorElem(SqList list ,ElemType elem, ElemType * elemPtr); /*在list中查找元素elem的前一个元素,并将找到的元素存放到elemPtr指针中*/
Status NextElem(SqList list, ElemType elem, ElemType * elemPtr);  /*在list中查找元素elem的后一个元素,并将找到的元素存放到elemPtr指针中*/
Status ListInsert(SqList * list,int i,ElemType elem);		/*在list的第i个位置插入元素elem*/
Status ListDelete(SqList * list,int i,ElemType * elemPtr);	/*在list中删除第i个元素,并将第i个元素存放到elemPtr指针中*/

Status Visit(ElemType elem);   /*对elem操作 */ 
Status ListTraverse(SqList list,Status (*visit)(ElemType));		/* 遍历表 */
Status ListUnion(SqList * listA,SqList listB);	/* 将listB 中的数据合并到listA中	*/
int main()
{
	
 int i,j;
 SqList list,listA,listB;
 ElemType  elem;
 InitList(&list);
 InitList(&listA);
 InitList(&listB);
 
 if(!ListTraverse(list,Visit))
 printf("list没有数据打印!\n");
 for(i=0;i<9;i++){
	ListInsert(&list,i+1,i+100);
	ListInsert(&listA,i+1,i+200);
 }
 for(i=5;i<30;i++)
	ListInsert(&listB,i+1,i+200);/* i=26的时候,listB的数量超过20个,会将存储空间扩容*/
 printf("list的数据:\t");
 ListTraverse(list,Visit); 
 if(PriorElem(list,103,&elem))
 printf("103前面的一个数字为;%d\n",elem);

 if(NextElem(list,103,&elem))
 printf("103后面的一个数字为:%d\n",elem);

 printf("在第2个位置插入999\n");
 ListInsert(&list,2,999);
 printf("list的数据:\t");
 ListTraverse(list,Visit); 

 ListDelete(&list,5,&elem);
 printf("删除第5个数字:%d\n",elem);
 printf("list的数据:\t");
 ListTraverse(list,Visit);
 i=ListUnion(&listA,listB); /*将listB数据合并到listA中*/
 j=4;
 printf("listA的数据为:\n");
 ListTraverse(listA,Visit);
 
 DestoryList(&listA);  	    /*销毁listA,释放地址*/
 DestoryList(&listB);
 DestoryList(&list);
 return 0;

}

 /*初始化线性表list*/
Status InitList(SqList *list)
{
	list->elem = (ElemType*) malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(list->elem == NULL)
		return ERROR;
	list->length = 0;
	list->listSize = LIST_INIT_SIZE;
	return OK;
} 

 /*销毁线性表list*/
void DestoryList(SqList * list)
{
  free(list->elem);
  list->elem = NULL;
  list->length = 0;
  list->listSize = 0;
}

 /*清空线性表list*/
void ClearList(SqList * list){
	list->length=0;
}

 /*判断线性表是否为空表,空表返回TRUE,非空返回FALSE*/
Status ListEmpty(SqList list){

	if(list.length>0)
		return FALSE;
	else 
		return TRUE;

}

/*返回list的元素个数*/
int ListLength(SqList list){
	return list.length;
}

/*从list中获取第i个元素,并将获取到的元素放到 elemPtr指针中,  获取到返回OK,否则返回ERROR */
Status GetElem(SqList list,int i,ElemType * elemPtr){
	if(list.length==0 || i<1 || i>list.length)
		return ERROR;
	*elemPtr= list.elem[i-1];
	return OK;
}

 /*在list中查找第一个和elem相等的元素的位置,如果没有找到,返回ERROR,即0 */
int LocateElem(SqList list,ElemType elem)
{
	int i=0;
	for(; i<list.length; i++)
		if(list.elem[i]==elem)
			return i+1;
	return ERROR;
}

 /*在list中查找元素elem的前一个元素,并将找到的元素存放到elemPtr指针中*/
Status PriorElem(SqList list,ElemType elem,ElemType * elemPtr){

	int i;
	for(i=1 ; i<list.length; i++)/*第一个元素i=0没有前导,所以从第二个元素i=1开始*/
	{
		if(list.elem[i]==elem ){
	    	  *elemPtr=list.elem[i-1];
		  return OK;
		}
	}
	return ERROR;

}

 /*在list中查找元素elem的后一个元素,并将找到的元素存放到elemPtr指针中*/
Status NextElem(SqList list, ElemType elem, ElemType * elemPtr)
{
	int i;
	for( i=0; i<list.length-1; i++)/*最后一个元素没有后驱元素,所以查找到倒数第二个元素就结束(下标为list.length-2)*/
	{
		if(list.elem[i]==elem && i<list.length-1){
		  *elemPtr=list.elem[i+1];
		  return OK;
		}
	}
	return ERROR;
}

  /*在list的第i个位置插入元素elem*/
 Status ListInsert(SqList * list,int i,ElemType elem){
	 
	 int j;
	 ElemType * base;
	 if(i<1) 
		return ERROR;
	 if(list->length==list->listSize)/*list满了,需要对list扩容*/{
		base=(ElemType *) realloc(list->elem,(list->listSize+LIST_INCREMENT)*sizeof(ElemType));
		if(base!=NULL){  	/*扩容成功,将新的基地址赋值给list->elem,并更新list的存储空间listSize*/
			list->listSize += LIST_INCREMENT;
			list->elem=base;
		}
		else 
		 	return ERROR;
	 }
	 

	 for(j=list->length-1; j>=i-1; j--) /* 从第i个数据开始,所有元素向后移一位 */ 
		list->elem[j+1]=list->elem[j];
	 list->elem[j+1]=elem;		   /*在第i个位置的值更新为新值elem, 此时的j=i-2, j+1=i-1,data[j+1]的位置就是第i个元素位置 */
	 list->length++;

	 return OK;
	
 }

  /*在list中删除第i个元素,并将第i个元素存放到elemPtr指针中*/
 Status ListDelete(SqList * list,int i,ElemType * elemPtr) 
{
	int j;
	if(i<1 || i>list->length)
		return ERROR;
	*elemPtr=list->elem[i-1];

	for(j=i-1; j<list->length-1; j++)
		list->elem[j]=list->elem[j+1];
	list->length--;
	return OK;
}	

/*对elem操作,具体什么操作可以根据需要修改,本示例中是打印elem的值*/
Status Visit(ElemType elem){
	printf("%d\t",elem);
}


/*遍历线性表,并对每一个元素调用Visit函数,一旦Visit()失败,这遍历失败 */
Status ListTraverse(SqList list, Status(*Visit) (ElemType elem) ){

	int i;
	if(list.length==0)
		return ERROR;
	for(i=0;i<list.length;i++)
		(*Visit)(list.elem[i]);
	printf("\n");
	return OK;
}

 
 	
 /* 将listB 中的数据合并到listA中,B的元素已经在A中存在,不重复插入 */
 Status  ListUnion(SqList * listA,SqList listB){

	 int i ;
	 ElemType  elem;

	 for(i=1; i<=listB.length; i++) /*循环listB所有元素 */
	 {
		 if( GetElem(listB,i,&elem) && !LocateElem(*listA,elem))/*在获取listB的元素,存放到变量elem中,在 listA中查找elem,不存在插入*/
		 ListInsert(listA,listA->length+1,elem);
	 }
	
	 return OK;

 }	 

三. 优缺点

优点:读取快
缺点:插入和删除需要移动大量元素; 存储空间会有浪费的情况

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

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

相关文章

chrome 安装devtools

chrome 安装devtools 下载安装 链接&#xff1a;https://github.com/vuejs/devtools 选择对应版本&#xff1a; 安装yarn 下载 npm install -g yarn --registryhttps://registry.npmmirror.com进入下载的目录安装依赖 yarn install --registryhttps://registry.npmmirror.…

ASP.NET汽车销售管理系统的设计与开发

摘 要 随着人们生活水平的不断提高&#xff0c;人们对汽车的消费和需求也越来越旺盛。很多汽车销售公司的业务环节仍然运用人工记账的传统方法&#xff0c;既容易出错又会导致账目混乱&#xff0c;查询和统计起来也非常不方便&#xff0c;费时又费力&#xff0c;严重时会给公…

stm32单片机开发二、定时器-内部时钟中断和外部时钟中断、编码器

定时器本质就是一个计数器 案例&#xff1a;定时器定时中断 内部时钟中断 Timer_Init(); //定时中断初始化 /*** 函 数&#xff1a;定时中断初始化* 参 数&#xff1a;无* 返 回 值&#xff1a;无*/ void Timer_Init(void) {/*开启时钟*/RCC_APB1PeriphClockCmd(RCC…

CSS-复合选择器

作用&#xff1a; 后代选择器&#xff1a; 子代选择器 并集选择器 用逗号隔开&#xff0c;在style里面写的时候&#xff0c;每一个标签空一行。 <title>Document</title><style>p,div,span{color: aqua;}</style> </head> <body><p>…

在Linux操作系统中关于磁盘(硬盘)管理的操作

电脑中数据存储设备&#xff1a;硬盘&#xff08;实现数据的持久化存储&#xff09;&#xff0c;内存 在Linux操作系统中一切皆文件的思想&#xff0c;所有的设备在Linux操作系统中都是通过文件来标识的&#xff0c;所以每一个硬盘都对应一个块设备文件。 在Linux操作系统中所…

Golang | Leetcode Golang题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; // 贪心算法 func canJump(nums []int) bool {cover : 0n : len(nums)-1for i : 0; i < cover; i { // 每次与覆盖值比较cover max(inums[i], cover) //每走一步都将 cover 更新为最大值if cover > n {return true}}return false } …

YOLov5 + Gradio搭建简单的Web GUI

写在前面&#xff1a;当我们将模型训练出来了&#xff0c;此时就需要做UI界面给别人展示了。python提供的Gradio可以快速的搭建web页面。生成本地网址和公网网址&#xff0c;方面自己测试和用户测试。 一、安装 Gradio介绍 Gradio是一个开源的python库&#xff0c;用于构建机…

深度学习模型Deep Learning Model

什么是深度学习&#xff1f;&#xff1f; 深度学习模型是一种基于人工神经网络&#xff08;Artificial Neural Networks, ANN&#xff09;的机器学习模型&#xff0c;其核心思想是通过多层次的神经网络结构来学习数据的特征表示和模式。这些模型通常由多个层次&#xff08;深度…

WPS的JS宏如何设置Word文档的表格的单元格文字重新编号

希望对Word文档中的表格进行统一处理&#xff0c;表格内的编号&#xff0c;有时候会出现紊乱&#xff0c;下一个表格的编号承接了上一个表格的编号&#xff0c;实际需要重新编号。 当表格比较多时&#xff0c;手动更改非常麻烦&#xff0c;而且更改一遍并不能完成&#xff0c;…

测算sample gpt

测算代码 import pandas as pd import matplotlib.pyplot as pltlosspd.read_pickle("loss_8.pkl") plt.plot(loss) losspd.read_pickle("loss_16.pkl") plt.plot(loss) losspd.read_pickle("loss_4_8.pkl") plt.plot(loss) losspd.read_pickle(…

第5篇:创建Nios II工程之Hello_World<四>

Q&#xff1a;最后我们在DE2-115开发板上演示运行Hello_World程序。 A&#xff1a;先烧录编译Quartus硬件工程时生成的.sof文件&#xff0c;在FPGA上成功配置Nios II系统&#xff1b;然后在Nios II Eclipse窗口右键点击工程名hello_world&#xff0c;选择Run As-->Nios II …

低代码+定制物资管理:创新解决方案探析

引言 在当今快速变化的商业环境中&#xff0c;企业面临着不断增长的挑战&#xff0c;如提高效率、降低成本、满足客户需求等。为了应对这些挑战&#xff0c;企业需要不断创新并采用先进的技术解决方案。在这样的背景下&#xff0c;低代码开发和定制化物资管理成为了引领企业变…

03.Kafka 基本使用

Kafka 提供了一系列脚本用于命令行来操作 kafka。 1 Topic 操作 1.1 创建 Topic 创建一个名为 oldersix-topic 的 topic&#xff0c;副本数设置为3&#xff0c;分区数设置为2&#xff1a; bin/kafka-topics.sh \ --create \ --zookeeper 192.168.31.162:2181 \ --replication…

Blender曲线操作

1.几种常见建模方式 -多边形建模&#xff1a;Blender&#xff0c;C4D&#xff0c;3DsMax&#xff0c;MaYa -曲线&#xff1a; -曲面&#xff1a;Rhino&#xff08;Nurbs&#xff09; -雕刻&#xff1a;Blender&#xff0c;ZBrush -蜡笔&#xff1a;Blender 1&#xff09;新…

编译报错 - Missing trailing comma comma-dangle or Missing semicolon semi

一、comma-dangle规则&#xff1a; 这种错误通常出现在使用代码格式检查工具&#xff08;如ESLint&#xff09;时&#xff0c;具体是在JSON或者JavaScript对象、数组的最后一个元素后面缺少了逗号&#xff08;trailing comma&#xff09;。在某些编码标准中&#xff0c;要求在…

spring cloud eureka 初始化报错(A bean with that name has already been defined)

报错内容 The bean ‘eurekaRegistration’, defined in class path resource [org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration E u r e k a C l i e n t C o n f i g u r a t i o n . c l a s s ] , c o u l d n o t b e r e g i s t e r e d . A …

MySQL:飞腾2000+Centos7.6 aarch64 部署MySQL8.0.36

目录 1.硬件环境 2.MySQL选择 Bundle版本【全部文件】​编辑 3.下载并安装 4.安装完成后检查mysql 5.初始化MySQL 6.那就问了&#xff0c;都初始化了啥&#xff1f; 7.尝试启动MySQL 8.给mysql文件授权 9.再次尝试启动正常 10.mysql初始化目录出现了mysql.sock 11.找…

MATLAB可视化图形绘制详解

图形常见的修饰命令 ①曲线修饰 曲线修饰包括曲线的顔色、线型和标示符号的设置。曲线修饰的命令格式如下。 plot(x,y,option):option定义了曲线的颜色、线型和标示符号。 MATLAB曲线修饰的各种选项见表 举例&#xff1a; x-2*pi:pi/50:2*pi; y1x.^2;y2cos(2*X);y3y1.*y2…

STM32应用开发教程进阶--Wi-Fi通信(ESP8266模块:STA、AP、STA+AP)

实现目标 1、熟悉Wi-F、ESP8266模块 2、掌握ESP8266模块共3种工作模式&#xff1a;STA、AP、STAAP的配置 3、具体实现目标&#xff1a;&#xff08;1&#xff09;AT固件烧录&#xff1b;&#xff08;2&#xff09;ESP8266模块STA、AP、STAAP的配置 一、Wi-Fi概述 1、Wi-Fi定…

pycharm配置wsl开发环境(conda)

背景 在研究qanything项目的过程中&#xff0c;为了进行二次开发&#xff0c;需要在本地搭建开发环境。然后根据文档说明发现该项目并不能直接运行在windows开发环境&#xff0c;但可以运行在wsl环境中。于是我需要先创建wsl环境并配置pycharm。 wsl环境创建 WSL是“Windows Su…