顺序表的应用

一.顺序表的定义

    1.线性表的概念:线性表是n个类型相同的数据元素的有限序列,对n>0,除第一个元素无直接前驱和最后一个元素无直接后继外,其余的每一个数据元素都只有一个直接前驱和一个直接后继。

    2.线性表的逻辑结构:

    3.顺序存储方法:把线性表中的节点按照逻辑次序依次存放在一组地址连续的存储单元里的方法。

    4.顺序表:用顺序存储方法存储的线性表简称为顺序表。

    5.顺序表的特点:逻辑上相邻的节点其物理存储位置也相邻。

二.顺序表的应用

    关于顺序表的应用主要有在顺序表中进行尾部插入、尾部删除、头部插入、头部删除、任意位置的插入、任意位置的删除、查找元素、查找对应元素的下标等等。

    1.创建头文件seqlist.h

    头文件中主要包括为了防止头文件被重复引用的预处理块,用户构造的数据类型以及函数的声明。下面主要讲解一下结构体创建的一个思路:创建一个顺序表的结构体,主要含有两个成员变量:一个成员变量用于存放顺序表的元素,故定义成数组类型;一个成员变量用于存放顺序表的有效元素个数,故定义成无符号长整型的数据类型。具体的头文件seqlist.h代码如下:

//头文件只被编译一次
#pragma once
//为了让数组大小可以方便修改,所以将数组大小进行宏定义
#define SeqListMaxSize 100
//为了让数组元素的数据类型可以地方便修改,故将数据类型也进行宏定义
#define SeqListType char
//为了让每个函数在测试时都可以显示自己的函数名,故将打印信息进行宏定义
#define HEADER printf("\n===================%s==================\n",__FUNCTION__);
//定义该链表的结构体
typedef struct SeqList
{
    SeqListType data[SeqListMaxSize];
    //为了标识数据元素的有效个数,故定义无符号长整型变量
    size_t size;

}SeqList;

    2.包含main函数的文件seqlist.c

    该文件主要用于处理顺序表的一些应用,包括使用不同的方法对元素进行插入、删除、查找操作,以及通过简单的测试代码来测试编写的各函数的正确性。具体代码及其详细思路如下:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include"seqlist.h"
//1.首先要对结构体变量进行初始化。
//对于数组元素的初始化,由于该数组元素初始相当于无效的数组元素,故不炫耀对数组元素初始化
//对于数组元素的有效个数,由于我们需要数组元素的有效个数,故需对size进行初始化为0

void SeqListInit(SeqList* seqlist)

{
    //判断指针是否为空
    if(seqlist==NULL)
        return; 
    seqlist->size=0;
}
//2.尾部插入元素
//思路:直接在顺序表的有效元素个数的位置插入
void SeqListPushBack(SeqList* seqlist,SeqListType value)
{
    //判断指针是否为空
    if(seqlist==NULL)
        return;
    //判断链表是否已满
    if(seqlist->size>=SeqListMaxSize)
        return;
    //进行尾部插入操作
    seqlist->data[seqlist->size]=value;
    seqlist->size++;
}
//3.尾部删除元素
//思路:将顺序表中的有效元素个数减一
void SeqListPopBack(SeqList* seqlist)
{
    //判断指针是否为空
    if(seqlist==NULL)
        return;
    //在删除前判断顺序表是否为空
    if(seqlist->size==0)
        //顺序表已满
        return;
    //进行尾部删除,即将size--
    seqlist->size--;
}
//4.头部插入元素
//思路:将数组中的有效元素整体后移,数组下标为0的位置存放插入元素
void SeqListPushFront(SeqList* seqlist,SeqListType value)
{
    //判断指针是否为空
    if(seqlist==NULL)
        return;
    //判断顺序表是否已满
    if(seqlist->size>=SeqListMaxSize)
        return;
    //进行头部插入
    seqlist->size++;
    size_t i=seqlist->size-1;
    for(i;i>0;i--)
    {
        seqlist->data[i]=seqlist->data[i-1];
    }
    seqlist->data[0]=value;
}
//5.头部删除元素
//思路:删除顺序表的第一个元素,再讲顺序表中的有效元素整体前移
void SeqListPopFront(SeqList* seqlist)
{
    //判断指针是否为空
    if(seqlist==NULL)
        return;
    //判断顺序表是否为空
    if(seqlist->size==0)
        return;
    //进行头部删除元素
    size_t i=0;
    for(i=0;i<seqlist->size-1;i++)
    {
        seqlist->data[i]=seqlist->data[i+1];
    }
    seqlist->size--;
}
//0.打印数组元素
void PrintSeqList(SeqList* seqlist)
{
    //判断指针是否为空
    if(seqlist==NULL)
        return;
    //打印元素
    int i=0;
    for(i=0;i<seqlist->size;i++)
        printf("%c ",seqlist->data[i]);
    printf("\n");
    printf("size=%d\n",seqlist->size);
}
//6.pos位置进行插入
//思路:将pos位置之后的元素整体后移
void SeqListInsert(SeqList* seqlist,size_t pos,SeqListType value)
{
    //判断指针是否为空
    if(seqlist==NULL)
        return;
    //判断顺序表是否已满
    if(seqlist->size>=SeqListMaxSize)
        return;
    //检查pos位置是否在有效范围之内
    if(pos>seqlist->size)
        //pos越界
        return;
    //进行pos位置的插入
    seqlist->size++;
    size_t i=seqlist->size-1;
    for(i;i>=pos-1;i--)
    {
        seqlist->data[i]=seqlist->data[i-1];
    }
    seqlist->data[pos-1]=value;
}
//7.pos位置进行删除
//思路:从pos位置开始的元素整体向前移动
void SeqListDelete(SeqList* seqlist,size_t pos)
{
    //判断指针是否为空
    if(seqlist==NULL)
        return;
    //判断顺序表是否为空
    if(seqlist->size==0)
        return;
    //判断pos值是否在有效范围之内
    if(pos>seqlist->size||pos<=0)
        return;
    //进行删除操作
    size_t i=pos-1;
    for(i;i<=seqlist->size-2;i++)
    {
        seqlist->data[i]=seqlist->data[i+1];
    }
    seqlist->size--;
}
//8.读取pos位置的元素
//思路:将顺序表遍历一遍从而读取下标为pos-1的元素
void SeqListReadPos(SeqList* seqlist,size_t pos)
{
    //判断指针是否为空
    if(seqlist==NULL)
        return;
    //判断pos位置是否在有效范围之内
    if(pos<=0||pos>seqlist->size)
        return;
    //读取pos位置的元素
    printf("%d位置的元素为:%c\n",pos,seqlist->data[pos-1]);
}
//9.修改pos位置的元素
//思路:将顺序表遍历一遍从而修改下标为pos-1的元素
void SeqListModifyPos(SeqList* seqlist,size_t pos,SeqListType value)
{
    //判断指针是否为空
    if(seqlist==NULL)
        return;
    //判断pos位置是否在有效范围之内
    if(pos<=0||pos>seqlist->size)
        return;
    //修改pos位置的元素
    seqlist->data[pos-1]=value;
    printf("%d位置的元素修改为:%c\n",pos,seqlist->data[pos-1]);
}
//10.查找指定元素的下标
//思路:将顺序表遍历一遍从而找到顺序表中的元素与所要查找元素相同时的下标值
void SeqListFindValue(SeqList* seqlist,SeqListType value)
{
    //判断指针是否为空
    if(seqlist==NULL)
        return;
    //开始查找
    size_t i=0;
    for(i;i<seqlist->size;i++)
    {
        if(seqlist->data[i]==value)
            printf("元素%c的下标为:%d\n",value,i);
    }
}
//以下为测试代码,测试所编写的函数是否正确
void Test_SeqListInit(SeqList* seqlist)
{
    HEADER;
    SeqListInit(seqlist);
}
void Test_SeqListPushBack(SeqList* seqlist)
{
    HEADER;
    SeqListPushBack(seqlist,'a');
    SeqListPushBack(seqlist,'b');
    SeqListPushBack(seqlist,'c');
    SeqListPushBack(seqlist,'d');
}
void Test_SeqListPopBack(SeqList* seqlist)
{
    HEADER;
    SeqListPopBack(seqlist);
}
void Test_SeqListPushFront(SeqList* seqlist)
{
    HEADER;
    SeqListPushFront(seqlist,'x');
    SeqListPushFront(seqlist,'g');
}
void Test_SeqListPopFront(SeqList* seqlist)
{
    HEADER;
    SeqListPopFront(seqlist);
}
void Test_SeqListInsert(SeqList* seqlist)
{
    HEADER;
    SeqListInsert(seqlist,3,'t');
}
void Test_SeqListDelete(SeqList* seqlist)
{
    HEADER;
    SeqListDelete(seqlist,3);
}
void Test_SeqListReadPos(SeqList* seqlist)
{
    HEADER;
    SeqListReadPos(seqlist,3);
}
void Test_SeqListModifyPos(SeqList* seqlist)
{
    HEADER;
    SeqListModifyPos(seqlist,1,'1');
}
void Test_SeqListFindValue(SeqList* seqlist)
{
    HEADER;
    SeqListFindValue(seqlist,'1');
}
void Test()
{
    HEADER;
    struct SeqList seqlist;
    Test_SeqListInit(&seqlist);
    PrintSeqList(&seqlist);
    Test_SeqListPushBack(&seqlist);
    PrintSeqList(&seqlist);
    Test_SeqListPopBack(&seqlist);
    PrintSeqList(&seqlist);
    Test_SeqListPushFront(&seqlist);
    PrintSeqList(&seqlist);
    Test_SeqListPopFront(&seqlist);
    PrintSeqList(&seqlist);
    Test_SeqListInsert(&seqlist);
    PrintSeqList(&seqlist);
    Test_SeqListDelete(&seqlist);
    PrintSeqList(&seqlist);
    Test_SeqListReadPos(&seqlist);
    PrintSeqList(&seqlist);
    Test_SeqListModifyPos(&seqlist);
    PrintSeqList(&seqlist);
    Test_SeqListFindValue(&seqlist);
    PrintSeqList(&seqlist);
}
//主函数
int main()
{
    Test();
    return 0;
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值