数据结构中顺序表线性表的部分操作

/*
数据结构中对线性表的操作
使用的数据元素存储方式是静态存储
 */
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
typedef int ElemType;
typedef struct {
    int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */
    int length;
    ElemType *elem;
}SqList;

// 初始化线性表
int InitList(SqList *L){
    L->elem = (ElemType * )malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if(!L->elem){
        printf("Space allocation failed");
        exit(1);
    }
    L->length = 0;
    L->listsize = LIST_INIT_SIZE;
    printf("Space allocation successfully\n");
    return 0;
}

// 创建顺序表并向表中加入数据 ElemType a[ ]代表的是一个数组, n代表的是数组的大小
int CreateList(SqList *L, const ElemType a[ ],int n){
    InitList(L); //调用初始化函数
    int k=0;
    for (int i = 0; i < n; ++i) {
        L->elem[k] = a[i];
        printf("To create elements: %d \n", L->elem[k]);
        k++;
        L->length =k;
    }
    printf(" \n");
    return 0;
}


// 计算当前顺序线性表的长度
int ListLength(SqList *L){
    printf("The curren length:%d\n", L->length);
    return L->length;
}

//得到自己想要的元素 其中i代表L中的第i个数据元素的值
int GetElem(SqList *L, int i){
    int *value;  //elem用来存储从data中获取得到的值;
    if(i<0||i>L->length) {
        printf("I value too big or too small\n");
        exit(1);
    }
    value = &L->elem[i-1];
    printf("The value of the element: %d\n", *value);
    return *value;
}


//知道这个值,但是想要知道这个值所在的下标, value代表这个值
int LocateElem(SqList *L, ElemType value){
    int len = 1; //这里等于1是为了让  if(len>L->length) 这个条件成立
    for (int j = 0; j < L->length; ++j) {
        if(L->elem[j] == value)
        {
             printf("Subscript of value:%d\n", j);
        }
        len++;
    }
    if(len>L->length)
        printf("this value %d not exist\n", value);
    return 0;
}


// 判断当前顺序表是否是空表
int EmptyList(SqList*L){
    if(L->length==0){
        printf("The list is empty!!!");
        return 1;
    }
    return 0;
}

// 插入值 其中i代表要插入的位置, value代表要插入的值
int InsertList(SqList *L, int i, ElemType value){
    int k;
    if( (i<0) || (i>L->length+1) ) {
        printf("Invalid location!!!\n");
        exit(1);
    }
    if( L->length > LIST_INIT_SIZE ) {
        printf("The current is full!!!\n");
        exit(1);
    }

    //如果在i=0的时候要另拿出来进行比较元素后移
    if(i!=0){
        for (k = L->length; k >= i; k--) {
            L->elem[k] = L->elem[k - 1];
        }
        L->elem[i - 1] = value;
        L->length++;

    }else{
        for (k = L->length; k >= i; k--) {
            L->elem[k+1] = L->elem[k];
        }
        L->elem[i] = value;
        L->length++;
    }
    printf("Insert complete\n");
    printf("\n");

    return 0;

}

// 删除顺序表线性表L的第i个元素,并且用value来返回
int DeleteList(SqList *L, int i){
    ElemType value, *p, *q;
    EmptyList(L);
    if( (i<0) || (i>L->length) ){
        printf("illegal value of I");
    }
    if(i!=0) {
        value = L->elem[i - 1];
        q = &(L->elem[L->length - 1]);
        for (p = &(L->elem[i - 1]); p < q; p++) {
            *p = *(p + 1);
        }
        --L->length;
    } else{
        value = L->elem[i];
        q = &(L->elem[L->length - 1]);
        for (p = &(L->elem[i]); p < q; p++) {
            *p = *(p + 1);
        }
        --L->length;
    }
    printf("Delete complete");
    printf(" \n");
    return value;
}

// 销毁顺序线性表
int DestoryList(SqList *L){
    free(L->elem);
    L->length = 0;
    L->elem = NULL;
    L->listsize = 0;
    return 0;
}

// 重置顺序线性表为空表
int ClearList(SqList *L){
    L->length = 0;
    return 0;
}


int main(){
    int a[] = {3,4,5,6};
    int b[] = {2,3,4,5};

    SqList L;
    CreateList(&L, b, 4);   // 因为在创建时向里面添加数据时,调用了初始化的函数 InitList函数,所以会再次调用初始化函数。
//    ListLength(&L);
//    GetElem(&L, 2);
//    LocateElem(&L, 5);
//    InsertList(&L, 4,6);

    DeleteList(&L, 4);
    for (int i = 0; i < L.length; ++i) {
        printf("%d ", L.elem[i]);
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值