顺序表的实现

顺序表的实现

顺序表功能

  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;
}
posted @ 2025-03-13 21:47  骗人就变小狗  阅读(255)  评论(0)    收藏  举报