实现基于静态数组的顺序表的以下基本操作(进阶部分)

需求如下:
1. 初始化
2. 尾插
3. 尾删
4. 头插
5. 头删
6. 读任意位置元素
7. 修改任意位置元素
8. 查找指定元素值的下标
9. 在任意位置插入元素
这次我们的编程环境是Linux下,所以我们要创建一个seqlist.h与seqlist.c的文件,以及Makefile将其联合在一起。
废话不多说,我们开始编写代码。
seqlist.h

#pragma noce 


#include <stdio.h>

#define SeqlistMaxSize 100 //定义一个数组大小的宏

#define DELIMITER printf("------------------------分割线-----------------------\n");

typedef char SeqListType;

typedef struct SeqList{
    SeqListType arr[SeqlistMaxSize];
    size_t size;
}seqlist;

void SeqListInit(seqlist *seq);

void SeqListPushEnd(seqlist *seq,char value);

void SeqListPopEnd(seqlist *seq);

void SeqListPushFirst(seqlist *seq,char value);

void SeqListPopFirst(seqlist *seq);

void SeqListGetNum(seqlist *seq,size_t pos,char *argv);

void SeqListReviseNum(seqlist *seq,size_t pos,char value); 

void SeqListFindPos(seqlist *seq,char value,int *argv);

void SeqListInsert(seqlist *seq,size_t pos,char value);

void SeqListRemove(seqlist *seq,char value);

void SeqListRemoveAll(seqlist *seq,char value);

void SeqListRemovePos(seqlist **seq,size_t pos);

size_t SeqLsitSize(seqlist *seq);

int SeqListEmpty(seqlist *seq);

void SeqLsitBubbleSort(seqlist *seq);

seqlist.c

#include "seqlist.h"

//初始化
void SeqListInit(seqlist *seq)
{
    if(seq == NULL)
    {
        return;
    }
    seq->size = 0;
    return;
}

//尾插
void SeqListPushEnd(seqlist *seq,char value)
{
    if(seq == NULL)
    {
        return;
    }
    if(seq->size > SeqlistMaxSize)
    {
        printf("Seqlist is full.\n");
        return;
    }

    seq->arr[seq->size] = value;
    ++seq->size;
    return;
}

//尾删
void SeqListPopEnd(seqlist *seq)
{
    if(seq == NULL)
    {
        return;
    }
    if(seq->size == 0)
    {
        printf("SeqList is null.\n");
        return;
    }

    --seq->size;
    return;
}

//头插
void SeqListPushFirst(seqlist *seq,char value)
{
    if(seq == NULL)
    {
        return;
    }
    if(seq->size >= SeqlistMaxSize)
    {
        printf("Seqlist is full.\n");
        return;
    }

    ++seq->size;
    int i = 1;
    for(; i<=seq->size; i++)
    {
        seq->arr[seq->size-i]=seq->arr[seq->size-i-1];
    }
    seq->arr[0] = value;
    return;
}

//头删
void SeqListPopFirst(seqlist *seq)
{
    if(seq == NULL)
    {
        return;
    }
    if(seq->size == 0)
    {
        printf("SeqList is null.\n");
        return;
    }
    --seq->size;
    int i = 0;
    for(; i<seq->size; i++)
    {
        seq->arr[i] = seq->arr[i+1];
    }
    return;
}

//读取任意位置元素,打印元素
void SeqListGetNum(seqlist *seq,size_t pos,char *argv)
{
    if(seq == NULL)
    {
        return;
    }
    if(seq->size == 0)
    {
        printf("SeqList is null.\n");
        return;
    }
    if(pos <= seq->size-1)
    {
        *argv = seq->arr[pos];
        return;
    }
    else
    {
        printf("Input 'pos' error.\n");
    }
    return;
}

//修改任意元素
void SeqListReviseNum(seqlist *seq,size_t pos,char value)
{
    if(seq == NULL)
    {
        return;
    }
    if(seq->size == 0)
    {
        printf("SeqList is null.\n");
        return;
    }
    if(pos <= seq->size-1)
    {
        seq->arr[pos] = value;
    }
    else
    {
        printf("Input 'pos' error.\n");
    }
    return;
}

//打印指定元素下标
void SeqListFindPos(seqlist *seq,const char value,int *pos)
{
    if(seq == NULL)
    {
        return;
    }
    if(seq->size == 0)
    {
        printf("SeqList is null.\n");
        return;
    }
    int i = 0;
    for(;i<seq->size;i++)
    {
        if(seq->arr[i] == value)
        {
            *pos = i;
            return;
        }
    }
    printf("SeqList is not find.\n");
    return;
}

//在任意位置插入元素
void SeqListInsert(seqlist *seq,size_t pos,char value)
{
    if(seq == NULL)
    {
        return;
    }
    if(seq->size == 0)
    {
        printf("SeqList is null.\n");
        return;
    }
    if(pos >= seq->size-1)
    {
        printf("pos error.\n");
        return;
    }
    ++seq->size;
    int i = seq->size-1;
    for(;i>=pos;--i)
    {
        seq->arr[i] = seq->arr[i-1];
    }
    seq->arr[pos] = value;
    return;
}

//删除指定的值,如果有只删除一个
void SeqListRemove(seqlist *seq,char value)
{
    if(seq == NULL)
    {
        return;
    }
    if(seq->size == 0)
    {
        printf("SeqList is null.\n");
        return;
    }
    int i = 0;
    for(;i<seq->size-1;i++)
    {
        if(seq->arr[i] == value)
        {
            while(i<seq->size-1)
            {
                seq->arr[i] = seq->arr[i+1];
                ++i;
            }
            --seq->size;
            return;
        }
        if(i == seq->size-1)
        {
            printf("no find 'value.\n'");
            return;
        }
    }
    return;
}

//删除指定下标的值(与SeqListRemoveAll函数相匹配)
void SeqListRemovePos(seqlist **seq,size_t pos)
{
    if((*seq) == NULL)
    {
        return;
    }
    if((*seq)->size == 0)
    {
        printf("SeqList is null.\n");
        return;
    }
    if(pos>(*seq)->size-1)
    {
        printf("pos is error.\n");
        return;
    }
    size_t i = pos;
    for(;i<(*seq)->size;i++)
    {
        (*seq)->arr[i]=(*seq)->arr[i+1];
    }
    --(*seq)->size;
    return;
}

//删除指定的值,如果存在多个,则全部删除
void SeqListRemoveAll(seqlist *seq,char value)
{
    if(seq == NULL)
    {
        return;
    }
    if(seq->size == 0)
    {
        printf("SeqList is null.\n");
        return;
    }
    size_t i = 0;
    for(;i<seq->size;i++)
    {
        if(seq->arr[i] == value)
        {
            SeqListRemovePos(&seq,i);
            --i;
        }
        if(i == seq->size)
        {
            printf("no find 'value.'\n");
            return;
        }
    }
    return;
}

//返回链表的长度
size_t SeqListSize(seqlist *seq)
{
    if(seq == NULL)
    {
        return -1;
    }
    if(seq->size == 0)
    {
        printf("SeqList is null.\n");
        return 0 ;
    }
    return seq->size;
}

//判断链表是否为空,如果为空则返回1,如果不为空为0,不存在这个链表则为-1
int SeqListEmpty(seqlist *seq)
{
    if(seq == NULL)
    {
        return -1;
    }
    if(seq->size == 0)
    {
        printf("SeqList is null.\n");
        return 1 ;
    }
    return 0;
}

//将链表进行冒泡排序(默认为升序)
void SeqListBubbleSort(seqlist *seq)
{
    if(seq == NULL)
    {
        return;
    }
    if(seq->size == 0)
    {
        printf("SeqList is null.\n");
        return;
    }
    int i = 0;
    int j = 0;
    for(j=0;j<seq->size-1;j++)
    {
        for(i=0;i<seq->size-j;i++)
        {
            if(seq->arr[i] > seq->arr[i+1])
            {
                seq->arr[i]=(seq->arr[i])^(seq->arr[i+1]);
                seq->arr[i+1]=(seq->arr[i])^(seq->arr[i+1]);
                seq->arr[i]=(seq->arr[i])^(seq->arr[i+1]);
            }
        }
    }
    return;
}

//-------------------------------------------------------------------------
//测试函数
//-------------------------------------------------------------------------
#include <stdio.h>

char argv = 0;//这个是打印元素的载体
int pos = -1;//这个是打印下标的载体

//打印函数
void SeqListPrint(seqlist *seq,const char *msg)
{
    if(seq == NULL)
    {
        return;
    }
    DELIMITER;
    printf("%s\n",msg);
    int i = 0;
    for(; i<seq->size; i++)
    {
        printf("[%c]",seq->arr[i]);
    }
    printf("\n");
    if(argv != 0)
    {
        printf("%c\n",argv);
        argv = 0;
    }
    if(pos != -1)
    {
        printf("%d\n",pos);
        pos = -1;
    }
    return;
}

//测试函数
void SeqListTest()
{
    seqlist seq;
    SeqListInit(&seq);

    SeqListPushEnd(&seq,'a');
    SeqListPushEnd(&seq,'b');
    SeqListPushEnd(&seq,'c');
    SeqListPushEnd(&seq,'d');
    SeqListPrint(&seq,"SeqListPushEnd");

    SeqListPopEnd(&seq);
    SeqListPrint(&seq,"SeqListPopEnd");

    SeqListPushFirst(&seq,'x');
    SeqListPrint(&seq,"SeqListPushFirst");

    SeqListPopFirst(&seq);
    SeqListPrint(&seq,"SeqListPopFirst");

    SeqListGetNum(&seq,2,&argv);
    SeqListPrint(&seq,"SeqListGetNum");

    SeqListReviseNum(&seq,1,'v');
    SeqListPrint(&seq,"SeqListReviseNum");

    SeqListFindPos(&seq,'v',&pos);
    SeqListPrint(&seq,"SeqListFindPos");

    SeqListInsert(&seq,1,'z');
    SeqListPrint(&seq,"SeqListInsert");

    SeqListRemove(&seq,'c');
    SeqListPrint(&seq,"SeqListRemove");

    SeqListRemoveAll(&seq,'c'); 
    SeqListPrint(&seq,"SeqListRemoveAll");

    SeqListPrint(&seq,"SeqListSize");
    printf("%d\n",SeqListSize(&seq));

    SeqListPrint(&seq,"SeqListEmpty");
    printf("%d\n",SeqListEmpty(&seq));

    SeqListBubbleSort(&seq);
    SeqListPrint(&seq,"SeqListBubbleSort");
    return;
}

//主函数
int main()
{   
    SeqListTest();
    return 0;
}

Makefile

seqlist:seqlist.c

    gcc $^ -o $@;


.PHONY:clean

    clean:rm seqlist

最后附上我整体运行的图片
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值