线性表的顺序存储

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

#define INIT_SIZE 50
#define INCRE_SIZE 20
typedef int ElemType;
typedef struct SQLIST
{
    ElemType* data; //存储空间基址
    int size; //当前元素个数
    int maxsize;//最大长度
}SqList,*SqListPtr;

SqListPtr InitList();//初始化顺序表

void ClearList(SqListPtr L);//置空顺序表

bool EmptyList(SqListPtr L);//判断表是否为空

int LengthList(SqListPtr L);//返回顺序表长度

void GetElem(SqListPtr L, int i, ElemType* e);//用e返回地i个元素的值

void PriorElem(SqListPtr L, ElemType e, ElemType** prior);//e是顺序表中的元素而且不是第一个,用prior返回他的前驱

void NextElem(SqListPtr L, ElemType e, ElemType** next);//e是顺序表中的元素而且不是最后一个,用next返回他的后继

void InsertList(SqListPtr L, int i, ElemType e);//在顺序表的第i个位置之前插入元素e如果初始空间不足,则扩充空间内存

void DeleteList(SqListPtr L, int i, ElemType* e);//删除表中第i个元素,并用e返回他的值

void PrintList(SqListPtr L);//打印顺序表

int main()
{
    puts("初始化顺序表");
    SqListPtr L = InitList();
    if (EmptyList(L))
    {
        puts("此时顺序表为空");
    }
    puts("把1到20插入顺序表");
    for (int i = 1; i <= 20; i++)
    {
        InsertList(L, i, i);
    }
    if (!EmptyList(L))
    {
        puts("此时顺序表不为空");
    }
    puts("输出顺序表长度");
    printf("%d\n", LengthList(L));
    puts("打印顺序表");
    PrintList(L);
    puts("再将21到80插入表中");
    for (int i = 21; i <= 80; i++)
    {
        InsertList(L, i, i);
    }
    puts("输出顺序表长度");
    printf("%d\n", LengthList(L));
    puts("打印顺序表");
    PrintList(L);
    puts("输出8的前驱与后继");
    ElemType* prior = NULL;
    ElemType* next = NULL;
    PriorElem(L, 8, &prior);
    NextElem(L, 8, &next);
    printf("8的前驱是%d  后继是%d\n", *prior, *next);
    puts("删除第10个元素并赋值给e");
    ElemType e;
    DeleteList(L , 10, &e);
    printf("e的值是%d\n", e);
    puts("打印顺序表");
    PrintList(L);
    puts("清空顺序表");
    ClearList(L);
    if (EmptyList(L))
    {
        puts("此时顺序表为空");
    }
    system("pause");
    return 0;
}

SqListPtr InitList()
{
    SqListPtr L = (SqListPtr)malloc(sizeof(SqList));
    L->data = (ElemType*)malloc(sizeof(ElemType) * INIT_SIZE);
    L->maxsize = INIT_SIZE;
    L->size = 0;
    return L;
}

void ClearList(SqListPtr L)
{
    if (L->size == 0 || L == NULL)
    {
        return;
    }
    free(L->data);
    L->data = (ElemType*)malloc(sizeof(ElemType) * INIT_SIZE);
    L->maxsize = INIT_SIZE;
    L->size = 0;
}

bool EmptyList(SqListPtr L)
{
    if (L == NULL)
    {
        exit(0);
    }
    if (L->size == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int LengthList(SqListPtr L)
{
    if (L == NULL)
    {
        exit(0);
    }
    return L->size;
}

void GetElem(SqListPtr L, int i, ElemType* e)
{
    if (L == NULL || i > L->size || i < 1)
    {
        return;
    }
    *e = *(L->data + i - 1);
}

void PriorElem(SqListPtr L, ElemType e, ElemType** prior)
{
    if (L == NULL)
    {
        return;
    }
    int i = 2;
    while (i <= L->size)
    {
        if (e == *(L->data + i - 1))
        {
            *prior = L->data + i - 2;
            break;
        }
        i++;
        
    }
}

void NextElem(SqListPtr L, ElemType e, ElemType** next)
{
    if (L == NULL)
    {
        return;
    }
    int i = 1;
    while (i < L->size)
    {
        if (e == *(L->data + i - 1))
        {
            *next = L->data + i;
            break;
        }
        i++;
    }
}

void InsertList(SqListPtr L, int i, ElemType e)
{
    if (L == NULL || i > L->size + 1 )
    {
        return;
    }
    if (L->size + 1 > L->maxsize)
    {
        L->data = (ElemType*)realloc(L->data, sizeof(ElemType) * (L->maxsize + INIT_SIZE));
        L->maxsize += INIT_SIZE;
    }
    int count = L->size + 1;
    while (count >= i)
    {
        *(L->data + count) = *(L->data + count - 1);
        count--;
    }
    *(L->data + i - 1) = e;
    L->size++;
}

void DeleteList(SqListPtr L, int i, ElemType* e)
{
    if (L == NULL || i < 1 || i > L->size)
    {
        return;
    }
    *e = *(L->data + i - 1);
    while (i <= L->size)
    {
        *(L->data + i - 1) = *(L->data + i);
        i++;
    }
    L->size--;
}

void PrintList(SqListPtr L)
{
    if (L == NULL || EmptyList(L))
    {
        return;
    }
    for (int i = 1; i <= L->size; i++)
    {
        printf("%d  ", *(L->data + i - 1));
    }
    putchar('\n');
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值