静态数组顺序表

实现基于静态数组的顺序表的以下基本操作:
1. 初始化
2. 尾插
3. 尾删
4. 头插
5. 头删
6. 读任意位置元素
7. 修改任意位置元素
8. 查找指定元素值的下标
9. 在任意位置插入元素

实现在顺序表中增删查改需注意以下几点:
  1.初始化时不用将所有元素赋值为0,那样会降低代码效率
  2.插入元素时应该判断顺序表是否已经满了
  3.删除元素时只需将需删除的元素覆盖,使之无效即可

以下是实现代码:

SeqList.h

#pragma once     //防止头文件重复包含

#include <stdlib.h> 

#define SeqListMaxNum 1000    //数组最大元素个数

typedef char SeqListType;    //重定义类型
typedef struct SeqList
{
    SeqListType SeqListArr[SeqListMaxNum];
    size_t size;      //元素个数
}SeqList;

void SeqListInit(SeqList* seq);       //初始化顺序表
void SeqListPrint(SeqList* seq, char* ch);      //打印顺序表

void SeqListPushEnd(SeqList* seq, SeqListType value);     //尾插一个元素
void SeqListPopEnd(SeqList* seq);           // 尾删一个元素

void SeqListPushStart(SeqList* seq, SeqListType value);     //头插一个元素
void SeqListPopStart(SeqList* seq);        //头删一个元素

void SeqListPushPosition(SeqList* seq, size_t pos, SeqListType value);    //在下标为pos处插入元素
void SeqListPopPosition(SeqList* seq, size_t pos);               //删除下标为pos的元素

void SeqListSetList(SeqList* seq, size_t pos, SeqListType value);     //修改下标为pos的元素

SeqListType SeqListGetList(SeqList* seq, size_t pos);       //读下标为pos的元素
size_t SeqListGetpos(SeqList* seq, SeqListType value);      //查找value元素值的下标

SeqList.c

#include "SeqList.h"
#include <stdio.h>
#include <assert.h>

//初始化顺序表
void SeqListInit(SeqList* seq)
{
    assert(seq);
    seq->size = 0;
}

//打印顺序表
void SeqListPrint(SeqList* seq, char* ch)
{
    assert(seq);
    int i = 0;
    printf("%s\n", ch);
    for (i = 0; i < seq->size; i++)
    {
        printf("下标为%d的元素是:[%c]\n",i,seq->SeqListArr[i]);
    }
    printf("size = %ld\n\n", seq->size);
}

//尾插一个元素
void SeqListPushEnd(SeqList* seq, SeqListType value)
{
    assert(seq);
    if (seq->size >= SeqListMaxNum)
    {
        printf("顺序表已满,无法插入!\n\n");
        return;
    }
    else
    {
        seq->SeqListArr[seq->size] = value; 
        seq->size++;
    }
}

// 尾删一个元素
void SeqListPopEnd(SeqList* seq)
{
    assert(seq);
    if (seq->size == 0)
    {
        printf("顺序表为空表,无法删除!\n\n");
        return;
    }
    else
    {
        seq->size--;
    }
}

//头插一个元素
void SeqListPushStart(SeqList* seq, SeqListType value)
{
    assert(seq);
    if (seq->size >= SeqListMaxNum)
    {
        printf("顺序表已满,无法插入!\n\n");
        return;
    }
    else
    {
        int i = seq->size - 1;
        for (; i >= 0; i--)
        {
            seq->SeqListArr[i + 1] = seq->SeqListArr[i];    //将所有元素后移,为头插元素留出空间
        }
        seq->SeqListArr[0] = value;
        seq->size++;
    }
}

//头删一个元素
void SeqListPopStart(SeqList* seq)
{
    assert(seq);
    if (seq->size == 0)
    {
        printf("顺序表为空表,无法删除!\n\n");
        return;
    }
    else
    {
        int i = 0;
        for (; i < seq->size - 1;i++)
        {
            seq->SeqListArr[i] = seq->SeqListArr[i+1];     //删除一个元素只需将其覆盖掉即可
        }
        seq->size--;
    }
}

//在下标为pos处插入元素
void SeqListPushPosition(SeqList* seq, size_t pos, SeqListType value)
{
    assert(seq);
    if (seq->size >= SeqListMaxNum)
    {
        printf("顺序表已满,无法插入!\n\n");
        return;
    }
    else if (pos >= seq->size)
    {
        printf("非法坐标!\n\n");
        return;
    }
    else
    {
        int i = seq->size - 1;
        for (; i >= pos; i--)
        {
            seq->SeqListArr[i + 1] = seq->SeqListArr[i];      //将pos下标后所有元素后移,为插入元素留出空间
        }
        seq->SeqListArr[pos] = value;
        seq->size++;
    }
}

//删除下标为pos的元素
void SeqListPopPosition(SeqList* seq, size_t pos)
{
    assert(seq);
    if (seq->size == 0)
    {
        printf("顺序表为空表,无法删除!\n\n");
        return;
    }
    else if (pos >= seq->size)
    {
        printf("非法坐标!\n\n");
        return;
    }
    else
    {
        int i = pos;
        for (; i < seq->size - 1; i++)
        {
            seq->SeqListArr[i] = seq->SeqListArr[i + 1];
        }
        seq->size--;
    }
}

//修改下标为pos的元素
void SeqListSetList(SeqList* seq, size_t pos, SeqListType value)
{
    assert(seq);
    if (pos >= seq->size)
    {
        printf("非法坐标!\n\n");
        return;
    }
    else
    {
        seq->SeqListArr[pos] = value;
    }
}

//读下标为pos的元素
SeqListType SeqListGetList(SeqList* seq, size_t pos)
{
    assert(seq);
    if (pos >= seq->size)
    {
        printf("非法坐标!\n\n");
        return -1;
    }
    else
    {
        return seq->SeqListArr[pos];
    }
}

//查找value元素值的下标
size_t SeqListGetpos(SeqList* seq, SeqListType value)
{
    assert(seq);
    int i = 0;
    for (; i < seq->size; i++)
    {
        if (seq->SeqListArr[i] == value)
        {
            return i;
        }
    }
    return -1;
}

Test.c

//测试代码
#include "SeqList.h"
#include <stdio.h>
#include <windows.h>

//测试初始化顺序表
void TestSeqListInit()
{
    SeqList seq;
    SeqListInit(&seq);
    SeqListPrint(&seq,"*****初始化顺序表*****");
}

//测试尾插一个元素
void TestSeqListPushEnd()
{
    SeqList seq;
    SeqListInit(&seq);
    SeqListPushEnd(&seq, 'a');
    SeqListPushEnd(&seq, 'b');
    SeqListPushEnd(&seq, 'c');
    SeqListPushEnd(&seq, 'd');
    SeqListPrint(&seq, "*****尾插四个元素至顺序表*****");
}

// 测试尾删一个元素
void TestSeqListPopEnd()
{
    SeqList seq;
    SeqListInit(&seq);
    SeqListPushEnd(&seq, 'a');
    SeqListPushEnd(&seq, 'b');
    SeqListPushEnd(&seq, 'c');
    SeqListPushEnd(&seq, 'd');
    SeqListPopEnd(&seq);
    SeqListPrint(&seq, "*****在顺序表中尾删一个元素*****");
    printf("空表情况:\n");
    SeqListInit(&seq);
    SeqListPopEnd(&seq);
}

//测试头插一个元素
void TestSeqListPushStart()
{
    SeqList seq;
    SeqListInit(&seq);
    SeqListPushEnd(&seq, 'a');
    SeqListPushEnd(&seq, 'b');
    SeqListPushEnd(&seq, 'c');
    SeqListPushEnd(&seq, 'd');
    SeqListPushStart(&seq, 'e');
    SeqListPrint(&seq, "*****头插一个元素至顺序表*****");
}

//测试头删一个元素
void TestSeqListPopStart()
{
    SeqList seq;
    SeqListInit(&seq);
    SeqListPushEnd(&seq, 'a');
    SeqListPushEnd(&seq, 'b');
    SeqListPushEnd(&seq, 'c');
    SeqListPushEnd(&seq, 'd');
    SeqListPopStart(&seq);
    SeqListPrint(&seq, "*****在顺序表中头删一个元素*****");
    printf("空表情况:\n");
    SeqListInit(&seq);
    SeqListPopStart(&seq);
}

//测试在下标为pos处插入元素
void TestSeqListPushPosition()
{
    SeqList seq;
    SeqListInit(&seq);
    SeqListPushEnd(&seq, 'a');
    SeqListPushEnd(&seq, 'b');
    SeqListPushEnd(&seq, 'c');
    SeqListPushEnd(&seq, 'd');
    SeqListPushPosition(&seq, 2, 's');
    SeqListPrint(&seq, "*****在顺序表中指定位置插入一个元素*****");
    printf("非法坐标情况(在下标为20的位置插入元素):\n");
    SeqListPushPosition(&seq, 20, 'r');
}

//测试删除下标为pos的元素
void TestSeqListPopPosition()
{
    SeqList seq;
    SeqListInit(&seq);
    SeqListPushEnd(&seq, 'a');
    SeqListPushEnd(&seq, 'b');
    SeqListPushEnd(&seq, 'c');
    SeqListPushEnd(&seq, 'd');
    SeqListPopPosition(&seq, 2);
    SeqListPrint(&seq, "*****在顺序表中指定位置删除一个元素*****");
    printf("非法坐标情况(删除下标为8的元素):\n");
    SeqListPopPosition(&seq, 8);
}

//测试修改下标为pos的元素
void TestSeqListSetList()
{
    SeqList seq;
    SeqListInit(&seq);
    SeqListPushEnd(&seq, 'a');
    SeqListPushEnd(&seq, 'b');
    SeqListPushEnd(&seq, 'c');
    SeqListPushEnd(&seq, 'd');
    SeqListSetList(&seq, 1, 'o');
    SeqListPrint(&seq, "*****在顺序表中修改指定位置的元素*****");
    printf("非法坐标情况(修改下标为10的元素):\n");
    SeqListSetList(&seq, 10,'k');
}

//测试读取下标为pos的元素
void TestSeqListGetList()
{
    SeqList seq;
    SeqListInit(&seq);
    SeqListPushEnd(&seq, 'e');
    SeqListPushEnd(&seq, 'f');
    SeqListPushEnd(&seq, 'g');
    SeqListPushEnd(&seq, 'h');
    SeqListPrint(&seq, "*****在顺序表中读取指定位置元素*****");
    char ch = SeqListGetList(&seq, 1);
    printf("下标为1的元素为%c\n", ch);
    printf("非法坐标情况(读取下标为6的元素):\n");
    SeqListGetList(&seq, 6);
}

//测试查找value元素值的下标
void TestSeqListGetpos()
{
    SeqList seq;
    SeqListInit(&seq);
    SeqListPushEnd(&seq, 'e');
    SeqListPushEnd(&seq, 'f');
    SeqListPushEnd(&seq, 'g');
    SeqListPushEnd(&seq, 'h');
    SeqListPrint(&seq, "*****在顺序表中读取指定位置元素下标*****");
    size_t pos = SeqListGetpos(&seq, 'h');
    printf("h元素的下标为%ld\n", pos);
    printf("非法情况(读取元素W的下标):\n");
    size_t pos1 = SeqListGetpos(&seq, 'W');
    printf("W元素的下标为%ld,坐标非法!\n\n", pos1);
}

int main()
{
    TestSeqListInit();
    TestSeqListPushEnd();
    TestSeqListPopEnd();
    TestSeqListPushStart();
    TestSeqListPopStart();
    TestSeqListPushPosition();
    TestSeqListPopPosition();
    TestSeqListSetList();
    TestSeqListGetList();
    TestSeqListGetpos();
    system("pause");
    return 0;
}

结果如下:
默认数组中有4个元素(a,b,c,d)

1. 初始化
结果

2. 尾插
结果

3. 尾删
结果

4. 头插
结果

5. 头删
结果

6. 读任意位置元素
结果

7. 修改任意位置元素
结果

8. 查找指定元素值的下标
结果

9. 在任意位置插入元素
结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值