2021-08-04动态创建顺序表

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

#define InitSize 10 //初始顺序表的长度  
typedef struct 
{
    int *data;
    int length;   //当前顺序表存放数据的个数
    int MaxSize;  //最大顺表的容量
}SeqList;

//申请内存
void InitSeqlist(SeqList *L)
{
    L->data = (int*)malloc(sizeof(int)*InitSize); //malloc不会对申请的内存进行初始化
    L->length = 0;
    L->MaxSize = InitSize;
}
//插入元素在第i个位置插入元素e
void InsertList(SeqList *L,int i,int e)
{
    if(i < 1 || i > L->MaxSize)
    {
        printf("插入位置不合法\n");
        return;
    }
    if(L->length>=L->MaxSize)
    {
        printf("线性表已满\n");
        return;
    }
    for(int j = L->length;j >= i;j--)
    {
        L->data[j] = L->data[j-1]; //i位置后的元素往后移一位
    }
    L->data[i - 1] = e; //在第i个位置放入e
    L->length++;
}

// 删除第i个位置的元素
void DelectValue(SeqList *L,int i)
{
    if(i < 1 || i>L->length)
    {
        printf("删除的位置不合法\n");
    }
    for (int j = i; j < L->length; j++)
    {
        L->data[j-1] = L->data[j];
    }
    L->length--;
}
//动态扩大 len 个容量
void IncreaseSize(SeqList *L,int len)
{
    int *p = L->data;
    p = (int *)malloc(sizeof(int)*(InitSize+len));
    for (int i = 0; i < L->MaxSize; i++)
    {
        p[i] = L->data[i]; //把之前data里面的数据拿出来重新放到大容量的顺序表里面
    }
    L->MaxSize = L->MaxSize+len;
    free(p);
    
}
// 按位查找元素
void GetElem(SeqList *L,int i)
{
    if(i<1||i>L->length)
    {
        printf("查找位置不合法\n");
    }
    printf("找到了第%d位置的元素%d\n",i,L->data[i-1]);
}
// 按值查找元素
void GetValues(SeqList*L,int e)
{
     for (int i = 0; i < L->length; i++)
    {
        if(L->data[i] == e)
        {
            printf("找到了该元素%d,该元素的下表为%d\n",e,i);
            return;
        }
    }
    printf("没有找到该元素%d\n",e);
}
//打印输出
void ShowList(SeqList *L)
{
    for (int i = 0; i < L->length; i++)
    {
        printf("data[%d] = %d\n",i,L->data[i]);
    }
    printf("顺序表中数据的个数 length = %d\n",L->length);
}
int main()
{
    SeqList L;
    InitSeqlist(&L);

    for (int i = 1; i <= L.MaxSize; i++)
    {
        InsertList(&L,i,i);
    }

    DelectValue(&L,3);
    GetElem(&L,3);
    GetValues(&L,8);
    IncreaseSize(&L,5);
    ShowList(&L);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值