• C 线性表的顺序存储实现及插入、删除等操作示例


    一、线性表的定义

    线性表(Linear List)是由同一类型元素构成的有序序列的线性结构。线性表中元素的个数称为线性表的长度;线性表内没有元素(长度为0)时,称为空表;表的起始位置称为表头,表的结束位置称为表尾。

    线性表的抽象数据类型描述为:

    类型名称:线性表(List)

    数据对象集:线性表是由n个元素构成的有序序列(a1到an),其中a1是表的第一个元素(表头),an是表的最后一个元素(表尾)。ai+1称为ai的直接后继,ai称为ai+1的直接前驱,直接后继和直接前驱反映了元素之间一对一的邻接逻辑关系。

    操作集:对于一个具体的线性表L,其内部有表示位序的整数i以及和其对应的元素x。

    二、线性表的顺序存储实现

    线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表的各元素。在程序设计语言中,一维数组在内存中占用的存储空间就是一组连续的存储区域,因此,用一维数组来表示顺序存储的数据区域是再适合不过了。

    考虑到线性表的操作有插入、删除等,及表的长度是动态可变的,因此,数组的容量需设计得足够大。假设用Data[MAXSIZE]表示,其中MAXSIZE是一个根据实际问题定义的足够大的整数,线性表中的数据从Data[0]开始顺序存放。由于当前线性表中的实际元素可能未达到MAXSIZE多个,因此需要用一个变量Last来记录当前线性表中最后一个元素在数组中的位置。即Last起一个指针(实际是数组下标)的作用,始终指向线性表的最后一个元素。表空时Last = -1。

    如下图所示,若当前表长为Last +1,数据元素a0,a1......an分别存储在Data[0]到Data[Last]之间。

    typedef struct LNode* List;
    struct LNode
    {
    	int Data[20];
    	int lastPosition;//最后一个元素下标值
    };

     

    三、线性表的基本操作

    3.1 List MakeEmpty():初始化一个新的空线性表

    //创建线性表并初始化为空
    List MakeEmpty()
    {
    	List L;
    	L = (List)malloc(sizeof(struct LNode));//申请内存空间
    	L->lastPosition = -1;//lastPosition置为-1,说明表空
    	return L;
    }

    3.2 int FindKth(List L, int P):根据制定的位序P,返回L中相应的元素

    //返回指定位置的元素值
    int FindKth(List L, int P)
    {
    	if (P > L->lastPosition)
    		return -1;
    	else
    		return L->Data[P];
    }

    3.3 int Find(List L, int X):返回L中第一个X元素的下标值

    //寻找线性表中第一个X的下标
    int Find(List L, int X)
    {
    	for (int i = 0; i <= L->lastPosition+1; i++)
    	{
    		if (i == L->lastPosition+1)
    			return -1;//未找到
    		else if (L->Data[i] == X)
    			return i;//返回对应下标
    	}
    }

    3.4 bool Insert(List L, int P, int X):在L中下标为P的位置插入X

    插入元素时,先将线性表长度向后扩展1个元素长,之后将要插入位置及其后面的所有元素均向后移动一位,空出位置后再将新元素插入。

    //在下标为P的位置插入X
    bool Insert(List L, int P, int X)
    {
    	if (L->lastPosition == 20 || P > L->lastPosition)//如果线性表已满或所插位置不在线性表内,返回false
    		return false;
    	L->lastPosition++;//若能插入,线性表长度加1
    	//从P位置到最后,所有元素均向后移一位
    	for (int i = L->lastPosition; i > P; i--)
    	{
    		L->Data[i] = L->Data[i-1];
    	}
    	L->Data[P] = X;//在空出的P位置插入新的元素
    	return true;
    }

    3.5 bool Delete(List L, int P):删除L中下标为P的元素

    将相应位置元素删除后,原来在其后面的元素均向前移动一位,空出最后一个位置,最后将线性表长度减去1个元素长,删去线性表空余的位置。

    //删除下标为P的元素
    bool Delete(List L, int P)
    {
    	if (P > L->lastPosition)//如果所删元素位置不在线性表内,返回false
    		return false;
    	//将位置P后的元素均向前移一位
    	for (int i = P; i < L->lastPosition; i++)
    	{
    		L->Data[i] = L->Data[i + 1];
    	}
    	L->lastPosition--;//成功删除原位置为P的元素,线性表长度减1
    	return true;
    }

    3.6 int Length(List L):返回线性表L长度

    //返回线性表L长度
    int Length(List L)
    {
    	return L->lastPosition + 1;
    }
  • 相关阅读:
    疫苗玻璃瓶行业,能发生国产替代吗
    马斯克是如何借力打力的?
    什么是分析立体主义
    这5家公司代表了高瓴资本眼中的科技产业未来
    玻尿酸之王华熙生物,为什么要做食品和饮料(下)
    ajax缺点
    babel转码器
    docker 缺陷
    MVVM中的vm双向监听和mvc的缺点
    mybatisPlus中的模糊查询问题
  • 原文地址:https://www.cnblogs.com/HL-space/p/10546597.html
Copyright © 2020-2023  润新知