数据结构------顺序表的增删改查

  1. 顺序表

顺序表:存储的数据在物理内存上是连续的,内存地址连续。
顺序表的最大特点:支持随机访问,即想访问顺序表中第一个就访问第一个,想访问最后一个就访问最后一个,且时间复杂度为O(1)

  1. 代码实现顺序表的创建、增删(查改待添加)
/*************************************************************************
*   file name:sequencelist
*   function:  实现对顺序表的增删改查功能
*   date: 2025.5.14
*   note:none
*    Copyright (c) 2024-2025 l550036303@163.com All right reserved
**************************************************************************/
typedef int elementtype_t;


#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct SequenceList {
    elementtype_t * Addr;    //表示顺序表的首地址 此定义方式可以根据自己的情况来调节所需长度
    unsigned int size;  //表示顺序表的空间大小
    int last;           //表示顺序表最末尾的数据的序号
}seqlist_t;             //规范命名需要加 "_t"



bool seqlist_IsFull(seqlist_t * manager);
bool seqlist_movelist(seqlist_t *manager,int location);
/*************************************************************************
*   name:seqlist_creat
*   function:  实现对顺序表的创建
*   argument: 
*               @size 表示所创建的顺序表的空间大小
*   reval:返回指向顺序表的指针
*   date: 2025.5.14
*   note:none
**************************************************************************/
//创建顺序表
seqlist_t * seqlist_creat(unsigned int size){
    seqlist_t *manager = (seqlist_t *)calloc(1,sizeof(seqlist_t)); 
     //给seqlist分配空间失败的错误处理
    if(NULL == manager){
        perror("manager creat fault for seqlist creat");
        exit(-1);        
    }
    manager->Addr = (elementtype_t *)calloc(size,sizeof(elementtype_t));
     //给Addr分配空间失败的错误处理
    if(NULL == manager->Addr ){
        perror("manager creat fault for Addr creat");
        exit(-1);        
    }
    manager->size = size;
    manager->last = -1;

    return manager;
}

/*************************************************************************
*   name:seqlist_add_last
*   function:  在顺序表最后插入数据元素
*   argument: 
*               @manager 需要插入的目标顺序表
*               @element 要插入的数据
*   reval:
*   date: 2025.5.14
*   note:none
**************************************************************************/
bool seqlist_add_last(seqlist_t * manager,int element){
    if(seqlist_IsFull(manager)){
        printf("\tlist is full , add fail\n");
        return false;
    }
    // 把last向后+1 , 然后把element的值给所指的位置,实现插入
    manager->Addr[++manager->last] = element;
    printf("\tlast\tadd\tsuccess\n");
    return true;
}


/*************************************************************************
*   name:seqlist_add_last
*   function:  在顺序表的头部插入一个数据元素
*   argument: 
*               @manager 需要插入的目标顺序表
*               @element 要插入的数据
*   reval:
*   date: 2025.5.14
*   note:element应该是int数据
**************************************************************************/
bool seqlist_add_top(seqlist_t * manager,int element){
    int top = 0;
    if(seqlist_IsFull(manager)){
        printf("\tlist is full , add fail\n");
        return false;
    }
    seqlist_movelist(manager,top);
    
    manager->Addr[0]= element;
    printf("\ttop\tadd\tsuccess\n");
    return true;

}
/*************************************************************************
*   name:seqlist_movelist
*   function:让顺序表中的部分元素向后移动一个位置,辅助实现插入功能
*   argument: 
*               @manager 需要移动的顺序表
*               @location 从顺序表的哪个下标开始移动
*   reval: 以布尔类型返回结果 
*                            true 移动完成
*                            false移动失败
*   date: 2025.5.14
*   note:none
**************************************************************************/
bool seqlist_movelist(seqlist_t *manager,int location){
    if(location > manager->size && location < 0 ){
        return false;
    }
    for(int i= manager->last; i >= location;i--){
            manager->Addr[i+1] =manager->Addr[i]; 
    }
    manager->last++;
    return true;
}
/*************************************************************************
*   name:seqlist_IsFull
*   function:判断此顺序表是否已满,还有没有剩余空间
*   argument: 
*               @manager 需要判断的顺序表
*   reval: 以布尔类型返回结果       
*                               true 还有空间
*                               false没有空间了
*   date: 2025.5.14
*   note:none
**************************************************************************/
bool seqlist_IsFull(seqlist_t * manager){
    if( (manager->last)+1 >= manager->size){
        //空间已满
        return true;
    }
    //还有空间
    return false;
}

/*************************************************************************
*   name:seqlist_print
*   function:打印该顺序表中的元素
*   argument: 
*               @manager 需要打印的顺序表
*   reval: 以布尔类型返回结果  
                                true打印成功     
                                false打印失败,出现问题
*   date: 2025.5.14
*   note:none
**************************************************************************/
bool seqlist_print(seqlist_t *manager){
    if(NULL == manager){
        printf("this sequencelist is empty\n");
        return false;
    }
    for(int i=0;i<=manager->last;i++){
        if(0==i){
             printf("This sequenlist :\n");
        }
        printf("\tnumber:%d\tvalue:%d \n",i+1,(manager->Addr[i]));
    }
    return true;
}

int main(int agrc,char const *argv[]){

    seqlist_t * manager = seqlist_creat(10);
    seqlist_add_last(manager,100);
    seqlist_add_last(manager,200);
    seqlist_add_top(manager,10);
    seqlist_add_top(manager,50);
    seqlist_add_last(manager,300);
    seqlist_print(manager);
    return 0;
}
posted @ 2025-05-16 22:49  记得要好好吃饭  阅读(10)  评论(0)    收藏  举报