顺序表的初始化、插入、删除、遍历
/********************************************************************
* file name: seqlist.c
* author :MINDSETT@163.com
* date :2025/6/19
* function :该程序通过堆内存实现顺序表元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以
* 顺序表中元素的数据类型为DataType_t,用户可以根据实际情况修改顺序表中元素的类型
* note :None
*
* CopyRight (c)2025 MINDSETT@163.com All Right Reserved
*
* *****************************************************************/
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
//指定顺序表中的元素的数据类型,用户可根据需要进行修改
typedef int DataType_t;
//构造一个实现顺序表的各项参数(顺序表的首地址+顺序表的容量+顺序表最后有效元素的下标)的结构体
typedef struct Sequence_list
{
DataType_t *addr; //顺序表的首地址
unsigned intsize; //顺序表的容量
int last; //顺序表最后有效元素的下标
}SeqList_t;
/********************************************************************
* name :Seqlist_Creat
* function :创建一个顺序表并进行初始化
* argument :
* @size:创建的顺序表的大小
* retval :返回顺序表管理结构体的首地址
* author :MINDSETT@163.com
* date :2025/6/19
* note :None
*
* ******************************************************************/
SeqList_t *Seqlist_Creat(unsigned int size)
{
//1.利用calloc对顺序表的管理结构体申请一个内存
SeqList_t *manager=(SeqList_t *)calloc(1,sizeof(SeqList_t));
if (NULL == manager){
perror("calloc memory for manager is failed\n");
exit(-1);
}
//2.对顺序表管理结构体的所有元素进行初始化
manager->addr=(DataType_t *)calloc(size,sizeof(DataType_t));
if (NULL == manager->addr){
perror("calloc memory for element is failed\n");
exit(-1);
}
manager->size=size;
manager->last=-1;
return manager;
}
/********************************************************************
* name :Seqlist_IsFull
* function :判断顺序表是否已满
* argument :
* @manager:需要判断的顺序表
* retval :已满返回true,未满返回false
* author :MINDSETT@163.com
* date :2025/6/19
* note :None
*
* ******************************************************************/
bool Seqlist_IsFull(SeqList_t *manager)
{
return (manager->last+1==manager->size)? true : false;
}
/********************************************************************
* name :Seqlist_IsEmpty
* function :判断顺序表是否为空
* argument :
* @manager:需要判断的顺序表
* retval :未满返回true,已满返回false
* author :MINDSETT@163.com
* date :2025/6/19
* note :None
*
* ******************************************************************/
bool Seqlist_IsEmpty(SeqList_t *manager)
{
return (-1==manager->last)? true : false;
}
/********************************************************************
* name :Seqlist_TailAdd
* function :从顺序表的尾部插入一个元素
* argument :
* @manager:需要操作的顺序表
* @Data:需要插入的元素
* retval :成功返回true,失败返回false
* author :MINDSETT@163.com
* date :2025/6/19
* note :None
*
* ******************************************************************/
bool Seqlist_TailAdd(SeqList_t *manager,DataType_t Data)
{
//判断顺序表是否已满
if ( Seqlist_IsFull(manager) ){
printf("sequence list is Full\n");
return false;
}
//如果顺序表有剩余空间,则把新元素插入顺序表的尾部,并更新管理结构体中最后有效元素的下标
manager->addr[++manager->last]=Data;
return true;
}
/********************************************************************
* name :Seqlist_HeadAdd
* function :从顺序表的首部插入一个元素
* argument :
* @manager:需要操作的顺序表
* @Data:需要插入的元素
* retval :成功返回true,失败返回false
* author :MINDSETT@163.com
* date :2025/6/19
* note :None
*
* ******************************************************************/
bool Seqlist_HeadAdd(SeqList_t *manager,DataType_t Data)
{
//判断顺序表是否已满
if ( Seqlist_IsFull(manager) ){
printf("sequence list is Full\n");
return false;
}
//如果顺序表有空闲空间,将顺序表中的元素依次向后移1个单位
for (int i=manager->last;i>=0;i--){
manager->addr=manager->addr;
}
//将新元素插入顺序表的尾部,并更新管理结构体中最后有效元素的下标
manager->addr=Data;
manager->last++;
return true;
}
/********************************************************************
* name :Seqlist_Delete
* function :删除数据表的一个元素
* argument :
* @manager:需要操作的顺序表
* @Data:需要删除的元素
* retval :成功返回true,失败返回false
* author :MINDSETT@163.com
* date :2025/6/19
* note :None
*
* ******************************************************************/
bool Seqlist_Delete(SeqList_t *manager,DataType_t Data)
{
//判断顺序表是否为空
if ( Seqlist_IsEmpty(manager) ){
printf("sequence list is empty\n");
return false;
}
//如果顺序表不为空,则判断该元素在顺序表中是否存在,如果存在,则判断数据在顺序表的尾部 OR 头部 OR 中间(*存在几个*)
int temp=-1;
for (int i=0;i<=manager->last;i++){
if(Data==manager->addr){
temp=i;
break;
}
}
if (-1==temp){
printf("Data[%d] is not found\n",Data);
return false;
}
if (temp==manager->last){
manager->addr='\0';
}else if(temp==0){
for(int i=0;i<manager->last;i++)
manager->addr=manager->addr;
manager->addr='\0';
}else{
for(int i=temp;i<manager->last;i++)
manager->addr=manager->addr;
manager->addr='\0';
}
manager->last--;
return true;
}
/********************************************************************
* name :Seqlist_print
* function :遍历顺序表
* argument :
* @manager:需要遍历的顺序表
* retval :None
* author :MINDSETT@163.com
* date :2025/6/19
* note :None
*
* ******************************************************************/
void Seqlist_Print(SeqList_t *manager)
{
//判断顺序表是否为空
if ( Seqlist_IsEmpty(manager) ){
printf("sequence list is empty\n");
return;
}
//如果顺序表不为空,则打印顺序表的元素
for (int i=0;i<manager->last+1;i++){
printf("Element[%d]=%d\n",i,manager->addr);
}
printf("\n");
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]