顺序表的初始化、插入、删除、遍历

/*******************************************************************
*
*	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 int  size;    //顺序表的容量
    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[i+1]=manager->addr[i];
    }
    //将新元素插入顺序表的尾部,并更新管理结构体中最后有效元素的下标
    manager->addr[0]=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[i]){
        temp=i;
        break;
        }
    } 
    if (-1==temp){
        printf("Data[%d] is not found\n",Data);
        return false;
    }
    if (temp==manager->last){
        manager->addr[manager->last]='\0';
    }else if(temp==0){
            for(int i=0;i<manager->last;i++)
                manager->addr[i]=manager->addr[i+1];
            manager->addr[manager->last]='\0';
    }else{
        for(int i=temp;i<manager->last;i++)
            manager->addr[i]=manager->addr[i+1];
        manager->addr[manager->last]='\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[i]);
    }
    printf("\n");
}



posted @ 2025-06-26 15:39  verd  阅读(47)  评论(0)    收藏  举报