顺序表的实现

顺序表的实现

顺序表功能

  1. 顺序表初始化
  2. 顺序表插入元素
  3. 顺序表删除元素
  4. 顺序表查找元素
/*****************************************************
* file name:sequencelist.c
* author :zzlyx1239@126.com
* date :2025.3.10
* brief :顺序表的实现
* note :none
*
* Copyright (c) 2025 zzlyx1239@126.com All Right Reserved
*
*******************************************************/
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
/********************************************************
*
* func name :
* brief :
* func parameter:
*
* return :none
* note :none
* func author :zzlyx1239@126.com
* data :2025/3/10
* version :V1.0
*
**************************************************************/
//宏定义顺序表中的数据类型
typedef int DataType_t;
//定义一个顺序表结构体,声明顺序表首地址,大小,最后一个数据下标等各项参数
typedef struct SequenceList
{
 DataType_t *Addr;//声明顺序表首地址
 int Size;//声明顺序表大小
 int Last;//声明顺序表最后一个元素数组下标
}SeqList_t;
//创建顺序列表并进行初始化
SeqList_t* SeqList_Creat(unsigned int size)
{
 //1.为所有顺序表管理者申请堆内存
 SeqList_t *Manager=(SeqList_t*)calloc(1,sizeof(Manager));
 //判断是否申请成功
 if(NULL==Manager)
 {
 perror("calloc for Manager memory is failed!");
 exit(-1);//异常退出
 }
 //2.为所有元素申请堆内存
 Manager->Addr=(DataType_t*)calloc(size,sizeof(DataType_t));
 if(NULL==Manager->Addr)
 {
 perror("calloc for Manager->Addr is failed!");
 free(Manager);
 exit(-1);//异常退出
 }
 
 //3.对顺序表进行初始化
 Manager->Size=size;
 Manager->Last=-1;
 return Manager;
}
//判断顺序表是否已经满了
bool SeqList_IsFull(SeqList_t *Manager)
{
 return Manager->Size==Manager->Last+1?true:false;
}
//向顺序表中添加元素 头插法
bool SeqList_HeadAdd(SeqList_t *Manager,DataType_t data)
{
 //判断顺序表是否已经满了
 if(SeqList_IsFull(Manager))
 {
 printf("Sequence is Full!!!");
 return false;
 }
 //顺序表没满,采用头插法插入数据
 for(int i=Manager->Last; i>=0;i--)
 {
 Manager->Addr[i+1]=Manager->Addr[i];
 }
 Manager->Addr[0]=data;
 Manager->Last++;
 return true;
}
//向顺序表中添加元素 尾插法
bool SeqList_TailAdd(SeqList_t *Manager,DataType_t data)
{
 //判断顺序表是否已经满了
 if(SeqList_IsFull(Manager))
 {
 printf("Sequence is Full!!!");
 return false;
 }
 //顺序表没满,采用尾插法插入数据
 Manager->Addr[Manager->Last+1]=data;
 Manager->Last++;
 return true;
}
//判断顺序表是否为空
bool SeqList_IsEmpty(SeqList_t *Manager)
{
	return (-1==Manager->Last)?true:false;
}
//删除指定数组下标的元素
bool SeqList_DelTar(SeqList_t *Manager,int Temp)
{
	//判断顺序表是否为空
 if(SeqList_IsEmpty(Manager))
 {
 printf("SeqList is Empty!!!");
 return false;
 }
 //不为空,继续删除
 if(Temp<=-1||Temp>Manager->Last)
 {
 printf("not find!!!");
 return false;
 }
 for(int i=Temp;i<Manager->Last;i++)
 {
 Manager->Addr[i]=Manager->Addr[i+1];
 }
 Manager->Last--;
 return true;
}
//删除顺序表指定数值的元素
bool SeqList_DelData(SeqList_t* Manager,DataType_t DestVal)
{
 int temp=-1;//记录元素的数组下标
 //判断顺序表是否为空
 if(SeqList_IsEmpty(Manager))
 {
 printf("SeqList is Empty!!!");
 return false;
 }
 //判断数值是否在顺序表内
 for(int i=0;i<Manager->Last;i++)
 {
 if(Manager->Addr[i]==DestVal)
 {
 temp=i;
 break;
 }
 }
 //如果temp=-1;顺序表中并没有该元素,退出函数
 if(-1==temp)
 {
 printf("destval [%d] is not found\n",DestVal);
 return false;
 }
 SeqList_DelTar(Manager,temp);
 return true;
}
//遍历顺序表中的元素
void SeqList_Print(SeqList_t *Manager)
{
 for(int i=0; i<=Manager->Last;i++)
 {
 printf("Addr[%d]=%d\n",i,Manager->Addr[i]);
 }
}
//
int main(){
 //1.创建顺序表
	SeqList_t * Manager = SeqList_Creat(10);
	
	//2.向顺序表中的尾部插入新元素
	SeqList_TailAdd(Manager,5);
 SeqList_TailAdd(Manager,6);
	//3.遍历顺序表
	SeqList_Print(Manager); // -- 5 
	printf("\n");
	//4.向顺序表中的头部插入新元素
	SeqList_HeadAdd(Manager,9);
	//5.遍历顺序表
	SeqList_Print(Manager); // --9 5 6
	printf("\n");
	//6.删除顺序表的元素
	SeqList_DelData(Manager,5);
	//7.遍历顺序表
	SeqList_Print(Manager); // --9
	printf("\n");
	return 0;
}
作者:骗人就变小狗原文地址:https://www.cnblogs.com/xiaren/p/18771082

%s 个评论

要回复文章请先登录注册