顺序表C语言

顺序表

SqList.h文件

#ifndef SQLIST_H
#define SQLIST_H

typedef unsigned short int ElemType;    //ElemType类型根据实际情况而定

typedef struct
{
    ElemType* elem;                     //数组存储数据,最大值为MAXSIZE
    unsigned int length;                //线性表当前长度(当前元素个数)
    unsigned int MaxSize;               //存储空间最大值
}SqList;                                //顺序表的结构类型

/*制作一个空的顺序表*/
void SqList_Init(SqList* L,unsigned int size);
/*追加元素*/
void SqList_Append(SqList* L, ElemType e);
/*遍历顺序表*/
void SqList_Traverse(SqList L);
/*插入元素:在下标 i 插入一个元素e */
void SqList_Insert(SqList* L, unsigned int i, ElemType e);
/*删除元素:删除下标 i 对应的元素 */
ElemType SqList_Delete(SqList* L, unsigned int i);
/*清空顺序表*/
void SqList_Clear(SqList* L);
/*销毁顺序表*/
void SqList_Destroy(SqList* L);

#endif // SQLIST_H

SqList.c文件

#include "SqList.h"

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

static const unsigned int INCREMENT = 5;       //存储空间增量

/*制作一个空的顺序表,分配内存*/
void SqList_Init(SqList* L, unsigned int size)
{
    L->length = 0;
    L->MaxSize = size;
    L->elem = calloc(sizeof(ElemType), L->MaxSize);
}

/*追加元素*/
void SqList_Append(SqList* L, ElemType e)
{
    L->elem[L->length] = e;
    L->length += 1;

    if (L->length == L->MaxSize)    //如果存储已满,则增加存储空间
    {
        L->MaxSize += INCREMENT;
        ElemType* temp = realloc(L->elem,sizeof(ElemType) * L->MaxSize);
        if (temp != NULL)           //防止重新分配内存失败后,原地址丢失
        {
            L->elem = temp;
        }
    }
}
/*遍历顺序表*/
void SqList_Traverse(SqList L)
{
    assert(L.length != 0);   //断言,顺序表不空

    for (unsigned int i = 0; i  <  L.length; i++)
    {
        printf("%d ", L.elem[i]);
    }
    printf("\n");
}

/*插入元素:在下标 i 插入一个元素e */
void SqList_Insert(SqList* L, unsigned int i, ElemType e)
{
    assert(L->length != 0);                 //断言,顺序表不空
    assert(i >= 0 && i < L->length);        //断言,0 <= i < length

     for (unsigned int j = L->length; j > i ; j--)
     {
         L->elem[j] = L->elem[j - 1];          //所有元素向后移动一个元素
     }
     L->elem[i] = e;
     L->length += 1;

     if (L->length == L->MaxSize)             //如果存储已满,则重新分配存储空间
     {
         L->MaxSize += INCREMENT;
         ElemType* temp = realloc(L->elem, sizeof(ElemType) * L->MaxSize);
         if (temp != NULL)                   //防止重新分配内存失败后,原地址丢失
         {
             L->elem = temp;
         }
     }
}
/*删除元素:删除下标 i 对应的元素 */
ElemType SqList_Delete(SqList* L, unsigned int i)
{
    assert(L->length != 0);                   //断言,顺序表不空
    assert(i >= 0 && i < L->length);          //断言,0 <= i < length

    ElemType e = L->elem[i];
    for (unsigned int j = i; j <= L->length; j++)
    {
        L->elem[j] = L->elem[j + 1];      //所有元素向前移动一个元素
    }
    L->length -= 1;
    return e;
}

/*清空顺序表*/
void SqList_Clear(SqList* L)
{
    assert(L->length != 0);   //断言,顺序表不空

    for (unsigned int i = 0; i < L->length; i++)
    {
        L->elem[i] = 0;             //顺序表内所有元素都为0
    }
    L->length = 0;
}
/*销毁顺序表*/
void SqList_Destroy(SqList* L)
{
    assert(L->elem != NULL);

    free(L->elem);
    L->elem = NULL;
    L->length = 0;
    L->MaxSize = 0;
}

/*测试*/
void SqList_Test(void)
{
    SqList list;
    SqList_Init(&list, 4);      
    SqList_Append(&list, 0);
    SqList_Append(&list, 1);
    SqList_Append(&list, 2);
    SqList_Append(&list, 3);
    SqList_Append(&list, 4);
    SqList_Traverse(list);
    SqList_Insert(&list, 1, 9);
    SqList_Traverse(list);
    SqList_Delete(&list, 0);
    SqList_Traverse(list);
    SqList_Append(&list, 6);
    list.elem[0] = 100;
    printf("%d\n", list.MaxSize);
    SqList_Traverse(list);
    SqList_Destroy(&list);
    printf("%p\n", list.elem);
}

测试:main.c文件

#include <stdio.h>
#include "SqList.h"

int main()
{
	SqList_Test(void);
	return 0;
}

测试结果

SqList_Test

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

往昔的恒纳兰那

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值