首页 > 其他分享 >顺序表的实现

顺序表的实现

时间:2024-05-06 22:12:31浏览次数:23  
标签:顺序 Last Addr 实现 SeqList 元素 Manager

/********************************************************************************************************
*
*	file name:	Zqh_顺序表.c
* 	author	 :	[email protected]
* 	date	 :	2024/05/05
*	function :	顺序表的增删改查
*	note	 :	模板
*	
*  Copyright (c)  2023-2025   [email protected]    All right Reserved
* ******************************************************************************************************/
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

//指的是顺序表中的元素的数据类型,用户可以根据需要进行修改
typedef int  DataType_t;


//构造记录顺序表SequenceList各项参数(顺序表的首地址 + 顺序表的容量 + 顺序表中最后有效元素的下标)的结构体
typedef struct SequenceList
{
	DataType_t * Addr;		//记录顺序表首地址
	unsigned int Size;		//记录顺序表的容量
	int			 Last;      //顺序表中最后元素的下标	

}SeqList_t;


//创建顺序表并对顺序表进行初始化
SeqList_t * SeqList_Create(unsigned int size)
{
	//1.利用calloc为顺序表的管理结构体申请一块堆内存
	SeqList_t *Manager = (SeqList_t*)calloc(1,sizeof(Manager));
	//calloc的返回值是是一块内存的首地址
	if (NULL==Manager){
		perror("calloc memory for Manager is failed");
		exit(-1);//程序异常终止
	}

	//2.利用calloc为所有元素申请堆内存
	Manager ->Addr = (DataType_t*)calloc(size,sizeof(DataType_t));

	if (NULL == Manager->Addr)
	{
		perror("calloc memory for element is failed");
		free(Manager);
		exit(-1);//程序异常终止
	}
	//3.对管理顺序表的结构体进行初始化(元素容量 + 最后元素下标)
		Manager->Size =size;	//对顺序表中的容量进行初始化
		Manager->Last = -1;		//由于顺序表为空,则最后元素下标初值为-1 

		return Manager;  
}


//判断顺序表是否已满
bool SeqList_IsFull(SeqList_t*Manager)
{
	return (Manager->Last + 1 == Manager->Size) ? true : false
}



//向顺序表尾部加入元素
bool SeqList_TaiAdd(SeqList_t *Manager,DataType_t Data)
{
	//1.判断顺序表是否已满
	if (SeqList_IsFull(Manager))
	{
		printf("SequenceList is Full\n");
		return false;
	}
	//2.如果顺序表有空闲空间,则把新元素添加到顺序表尾部
	Manager->Addr[++Manager->Last] = Data;
	

	return true;

}


//向顺序表的头部加入元素
bool SeqList_HeadAdd(SeqList_t*Manager,DataType_t Data)
{
	//1.判断顺序表是否已满
	if (SeqList_IsFull(Manager))
	{
		printf("SequenceList is Full\n");
		return false;
	}


	//2.如果顺序表有空闲空间,则需要把顺序表所有元素向后移动1个单位
	for(int i = Manager->Last; i>=0 ; i--){

		Manager->Addr[i+1] = Manager->Addr[i];
	
	}

	//3把新元素添加到顺序表的头部,并且更新管理结构体中的元素下标+1
	Manager->Addr[0] = Data;
	Manager->Last++;

	return true;
}



//判断顺序表是否为空
bool SeqList_IsEmpty(SeqList_t*Manager)
{
	return(-1 == Manager->Last) ? true : false;
}


//删除顺序表的元素
bool SeqList_Del(SeqList_t*Manager,DataType_t DestVal)
{
	int temp = -1; 	//记录要删除的元素的下标

	//1.判断顺序表是否为空
	if (SeqList_IsEmpty(Manager)){
		printf("SequenceList is Empty!\n");
		return false;
	}

	//2.此时需要查找目标值是否在顺序表中
	for (int i = 0; i <= Manager->Last; ++i){

		//如果目标值和顺序表中元素的值相同
		if (DestVal == Manager->Addr[i]){

			temp = i; //把目标元素的下标备份到变量temp中
			break;
		}
	}

	//3.如果顺序表没有目标值的元素则直接终止函数
	if (-1 == temp){
		printf("destval [%d] is not found\n",DestVal);
		return false;
	}

	//4.如果找到了目标元素,则直接把元素的后继元素向前移动一个单位
	for (int i = temp; i < Manager->Last; ++i){
		
		Manager->Addr[i] = Manager->Addr[i+1];

	}
	//5.由于删除了一个元素,则需要让顺序表的有效元素下标-1
	Manager->Last--;
	
	return true;

}


//遍历顺序表的元素
void SeqList_Print(SeqList_t*Manager)
{
	for (int i = 0; i <=Manager->Last; ++i){
		printf("Element[%d] = %d\n",Manager->Addr[i] );
	}

}


标签:顺序,Last,Addr,实现,SeqList,元素,Manager
From: https://www.cnblogs.com/kencszqh/p/18176037

相关文章

  • HarmonyOS 实现下拉刷新,上拉加载更多
    组件介绍PullToRefreshList允许用户通过下拉动作来刷新列表内容,以及通过上拉动作来加载更多的数据。组件内部封装了滚动监听、状态管理和动画效果,使得开发者可以轻松集成到自己的项目中。1.实现思路封装成可复用的公共控件:将下拉刷新和上拉加载更多功能封装为一个可复用的组......
  • 在英特尔至强 CPU 上使用 Optimum Intel 实现超快 SetFit 推理
    在缺少标注数据场景,SetFit是解决的建模问题的一个有前途的解决方案,其由HuggingFace与Intel实验室以及UKPLab合作共同开发。作为一个高效的框架,SetFit可用于对SentenceTransformers模型进行少样本微调。SetFit仅需很少的标注数据就能达到较高的准确率,例如,在使用3-......
  • docker-compose+nginx实现服务不中断更新
    思路是写一个脚本,docker-composescale扩容,然后重写nginx配置文件,刷新负载均衡nginx重写的配置文件,文件名service,里面只有upstream,例如:upstreame-chatbot-server-dev{server0.0.0.0:8080;server0.0.0.0:8081;}脚本使用方法:./rollupdate.sh--service=test-serve......
  • 以数组为基础实现循环队列
    /*****************************************************************name;CirQueue_Create*function:创建循环队列*parameter;unsighedintsize*ReValue;CirQueue_t**author;小北blog*attention;*date;2024.04.26*history;*version;*Copyright(c)......
  • WPF上位机 - 实现TIA Wincc中的输入输出域
    在TIAWincc中输入输出域可以显示PLC中的变量,同时可以改变PLC中的变量,而在上位机中,使用多线程实时读取数据,在输入数据的时候可能PLC数据改变使得上位机数据同时改变。所以需要在文本框获取到焦点的时候断开绑定,失去焦点的时候重新绑定数据。//view代码<TextB......
  • easyExcel多行表头设定不同样式和特定单元格设定样式的实现
    前言有个需求,需要设置Excel导出的样式,样式如下图所示,有三个表头行,第一个表头行需要加粗和灰色背景,另外两个表头行使用另外的样式,并且当测试结果单元格出现x或者未通过的时候,设置其为红色字体。实现步骤写入ExcelSheet的部分代码for(Map.Entry<String,List<ExcelDTO>>entr......
  • 二叉树进阶:二叉搜索树、平衡二叉树、KD树(实现KNN算法的快速寻找k个邻居)
    二叉搜索树二叉搜索树又称为二叉排序树、二叉查找树。请记住,本篇所介绍的所有树,都是二叉搜索树,也就是说都用到了二分查找的思想。二叉搜索树的特征:每个结点的左结点都小于结点本身,右结点都大于结点本身。用中序遍历来遍历一棵二叉搜索树,结果必然是有序的。时间复杂度很低......
  • axios 拦截器实现原理
    Axios拦截器是Axios提供的一种强大功能,允许你在请求发送到服务器之前或响应返回客户端之前对其进行修改或处理。拦截器主要有两种:请求拦截器(requestinterceptors)和响应拦截器(responseinterceptors)。实现原理拦截器数组:Axios内部维护了两个数组,一个用于存储请求拦截器,另......
  • Redisson的看门狗机制底层实现
    1.看门狗机制概述看门狗机制是Redission提供的一种自动延期机制,这个机制使得Redission提供的分布式锁是可以自动续期的。privatelonglockWatchdogTimeout=30*1000;1看门狗机制提供的默认超时时间是30*1000毫秒,也就是30秒如果一个线程获取锁后,运行程序到释放锁所花费的时......
  • vue实现使用JSZip批量下载图片
    1importJSZipfrom"jszip";2import{saveAs}from'file-saver';3import$from'jquery'45//jszip打包下载图片6functionsaveImgZip(imgUrlArrs,typeTxt){7varimgUrlArr=[];//图片列表8imgUrlArr=imgUrlAr......