数据结构——顺序表初始化及基操

这篇博客详细介绍了如何使用C语言实现顺序表的基本操作,包括静态和动态分配内存的方式。内容涵盖了初始化、插入元素、删除元素、按位和按值查找元素等功能。通过示例代码展示了静态和动态顺序表的创建、操作和销毁过程。
摘要由CSDN通过智能技术生成

//头文件
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
#define TypeEle int 

//定义顺序表
//静态分配(数组)
typedef struct{
    TypeEle data[MaxSize]; //存储数据 
    TypeEle length;            //当前长度 
}SqList;

//动态分配(指针)
typedef struct{
    TypeEle *data;            //头指针 
    TypeEle MSize;        //最大容量(类似于长方体中的长) 
    TypeEle length;            //当前长度 
}SeqList;

//初始化顺序表
bool InitList(SqList & L,TypeEle MaxSizeC){        //参数  需初始化表名(静态),表的最大存储长度 
    for(int i=0;i<MaxSizeC;i++){
        L.data[i] = 0;
    }
    L.length = 0;
    return true;

bool InitList2(SeqList & L2, TypeEle MaxSizeC){            //参数  需初始化表名(动态),表的最大存储长度
    L2.data = (TypeEle *)malloc(MaxSize *sizeof(TypeEle));
    //malloc() 分配一块连续的内存空间,并返回一个指针
    // sizeof() 求类型所占内存大小 (类似于长方体中的宽) 
    // MaxSize *sizeof(TypeEle) 整个表所占内存大小(类似于求长方体面积)
    // (TypeEle *)将malloc()返回的指针强制装换为与表指针一致类型
    L2.MSize = MaxSizeC;
    L2.length = 0; 
    return true;

//销毁顺序表
bool DestoryList(SqList & L){
    for(int i=0;i<L.length;i++){
        L.data[i] = 0;
    }
    L.length = 0;
    return true;
}

bool DestoryList2(SeqList & L2){
    free(L2.data);
    L2.length = 0;
    L2.MSize =0;
    return true;
}
//判断是否为空 
//求长度
TypeEle ListEmpty(SqList L){   
    return L.length ;
            
}

TypeEle ListEmpty2(SeqList L2){   
    return L2.length ;
            
}
//输出
void DispList(SqList L){
    for(int i = 0;i<L.length;i++){
        printf("静态表第%d个数据是 %d\n",i+1,L.data[i]);
    }
}

void DispList2(SeqList L2){
    for(int i = 0;i<L2.length;i++){
        printf("动态表第%d个数据是 %d\n",i+1,L2.data[i]);
    }
}
//按序查找
TypeEle GetElem(SqList L,TypeEle i){
    if(i<1 || i > L.length){
        printf("请输入正确位序\n");
        return -1;
    }
    return L.data[i];

TypeEle GetElem2(SeqList L2,TypeEle i){
    if(i<1 || i > L2.length){
        printf("请输入正确位序\n");
        return -1;
    }
    return L2.data[i];
}
//按值查找(第一个相同的元素) 
TypeEle LocateElem(SqList L,TypeEle e){            //参数  表名,插入位序,插入值 
    
    for(TypeEle i = 0 ;i<L.length;i++){
        if(L.data[i] == e)
            return i+1;
    }
    printf("没有相同元素\n");
    return 0;

TypeEle LocateElem2(SeqList L2,TypeEle e){
    
    for(TypeEle i = 0 ;i<L2.length;i++){
        if(L2.data[i] == e)
            return i+1;
    }
    printf("没有相同元素\n");
    return 0;

//插入数据元素
void InsertList(SqList & L,TypeEle i,TypeEle e){      //参数  表名,插入位序,插入值
    if(i<1 || i > L.length){
        printf("请输入正确位序\n");
        return ;
    }
    for(TypeEle j = L.length ;j>i;j--){     //插入位序后的所有元素向后移一位 
        L.data[j] = L.data[j-1]; 
    }
    L.data[i-1] = e;
    L.length ++;
    printf("插入数值后一位为 %d\n",L.data[i]);
}

void InsertList2(SeqList & L2,TypeEle i,TypeEle e){      //参数  表名,插入位序,插入值
    if(i<1 || i > L2.length){
        printf("请输入正确位序\n");
        return ;
    }
    if(L2.MSize == L2.length){
        printf("当前表已满,插入失败");
        return ;
    }
    
    for(TypeEle j = L2.length ;j>i;j--){     //插入位序后的所有元素向后移一位 
        L2.data[j] = L2.data[j-1]; 
    }
    L2.data[i-1] = e;
    L2.length ++;
    printf("插入数值后一位为 %d\n",L2.data[i]);
}
//删除数据元素 
//按位删除 
TypeEle DeleteElem(SqList & L,TypeEle i) {            //参数  表名,删除位序,返回被删除元素 
    if(i<1 || i > L.length){
        printf("请输入正确位序\n");
        return 0;
    }
    TypeEle e =0; 
    for(TypeEle j=i-1;j<L.length;j++ ){
        L.data[j] = L.data[j+1];
    }
    L.length --;
    return e;
}

TypeEle DeleteElem2(SeqList & L2,TypeEle i) {            //参数  表名,删除位序,返回被删除元素 
    if(i<1 || i > L2.length){
        printf("请输入正确位序\n");
        return 0;
    }
    TypeEle e =0; 
    for(TypeEle j=i-1;j<L2.length;j++ ){
        L2.data[j] = L2.data[j+1];
    }
    L2.length --;
    return e;
}

//按值删除(第一个相同的元素)

TypeEle DeleteOne(SqList & L,TypeEle e) {        //参数  表名,删除位序,返回被删除元素位序 
    
    TypeEle i = LocateElem(L,e) ;
    TypeEle E = DeleteElem(L,i);
    printf("第一个%d元素被删除\n",E);

TypeEle DeleteOne2(SeqList & L2,TypeEle e) {        //参数  表名,删除位序,返回被删除元素位序 
    
    TypeEle i = LocateElem2(L2,e) ;
    TypeEle E = DeleteElem2(L2,i);
    printf("第一个%d元素被删除\n",E);


int main(){
    //定义表 
    SqList L;
    SeqList L2;
//    初始化表
    bool init = InitList(L,MaxSize);
    if(init)
        printf("初始化成功!!\n");
    else printf("初始化失败!!!\n"); 
    
    bool init2 = InitList2(L2,MaxSize);
    if(init2)
        printf("初始化成功!!\n");
    else printf("初始化失败!!!\n"); 
//    插入数值
    for (int i =0;i<MaxSize-3;i++){
        L.data[i]=i;
        L2.data[i]=i+1;
        L.length ++;
        L2.length ++;
    } 
    printf("插入成功!!!\n");
//    求当前长度
    printf("当前长度为%d\n",ListEmpty(L));
    printf("当前长度为%d\n",ListEmpty2(L2));
//    输出
    DispList(L);
    printf("----------------\n");
    DispList2(L2);
    printf("-------------------------------------------\n");
//    按位插入    表名,插入位序,插入值
    InsertList(L,0,33333);
    InsertList2(L2,4,44444);

//输出
    DispList(L);
    printf("----------------\n");
    DispList2(L2);
    printf("-------------------------------------------\n");
//按位删除    名,删除位序,返回被删除元素
    TypeEle e1 = DeleteElem(L,2);
    printf("被删除元素为%d\n",e1);
    TypeEle e2=DeleteElem2(L2,0);
    printf("被删除元素为%d\n",e2);
    
//按值删除            表名,删除位序,返回被删除元素位序
    TypeEle i1=DeleteOne(L,2);
    printf("被删除元素位序为%d\n",i1);
    TypeEle i2=DeleteOne2(L2,2);
    printf("被删除元素位序为%d\n",i2);
    
//输出 
    DispList(L);
    printf("----------------\n");
    DispList2(L2);
    printf("-------------------------------------------\n");
//    销毁
    bool des = DestoryList(L);
    if(des)
        printf("销毁成功!!\n");
    else printf("销毁失败!!!\n"); 
    
    bool des2 = DestoryList2(L2);
    if(des2)
        printf("销毁成功!!\n");
    else printf("销毁失败!!!\n"); 
    
    return 0; 
}

/*----------------总结------------------
1、main函数  int main()
2、define取别名,需用“# ”声明
3、注意位序与下标的区别
4、free()参数得是指针
    所以释放动态指针时是 free(L2.data),而不是free(L2)
5、定义方法传参得给出类型
    void as(int a,int b)   正确
    void as1( a,int b)   错误
6、无返回值函数也可使用 “return”,只是不可以加返回值 


*/


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值