史华乐 发表于 2025-6-4 16:54:07

顺序表的实现

顺序表的实现

顺序表功能

[*]顺序表初始化
[*]顺序表插入元素
[*]顺序表删除元素
[*]顺序表查找元素
/*****************************************************
*   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
*
**************************************************************/

//宏定义顺序表中的数据类型
typedefint 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 forManager 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=Manager->Addr;
    }
    Manager->Addr=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=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=Manager->Addr;
    }
    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==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);
    }
}

//


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;
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 顺序表的实现