国瑾瑶 发表于 2025-6-26 20:30:28

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

/*******************************************************************
*
*        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]
查看完整版本: 顺序表的初始化、插入、删除、遍历