数据结构之线性表的初始化及其操作

简介: 数据结构之线性表的初始化及其操作

一.准备工作

1.定义存储空间的分配量

#define MAXSIZE 10

2.定义结果状态函数Status 返回成功失败的状态。

误区:刚开始我把Status理解成了C语言的一个关键字,后来才知道Status是一个用户自定义函数,是定义的一种类型。

用来表示成功或失败的状态。

typedef int Status;//Status是函数的类型

3.定义ElemType 函数类型,需要根据实际情况而定。

typedef为类型定义标识符,作用是为一个数据类型或者结构(比如struct)重新定义一个名称。

所以定义:

typedef int ElemType;

作用是:将关键字int重命名为ElemType

intElemType代表的类型是一样的,声明和定义的变量是等价的

4.通过结构类型来定义顺序表存储类型与定义。

typedef struct
     {
         ElemType data[MAXSIZE];
         int length;
     
     }SqList;

以上顺序表类型的定义【初始化】的含义:

为顺序表分配一个容量为MAXSIZE大小的数组空间,数组名为data ,并将线性表的当前长度length设为0.

[注意点]:

为什么用数组来对线性表进行存储?

顺序表的定义:用一组地址连续的存储单元依次存储线性表的各个数据元素,即用顺序存储的线性表

   它采用的数据元素存储方式是静态存储,这种方式还是有很多缺点的,因为你不知道自己实现到底需要计算机分配多少空间,在编程活动中,特别是我们的小学期中,很多同学出现了溢出或空间不够的现象,也就是传说中的“烫烫”,而数组的存储方式就是静态存储,计算机分配的空间都是你自己去定义的,后边进入链表我们会知道动态存储你需要多少空间计算机会自动按需分配,告别数组的这种静态存储带来的弊端。


二.功能函数的声明

void InitList(SqList *LP);//顺序表的初始化
    void CreateList(SqList *LP,ElemType a[],int n);//顺序表的创建
    void PrintList(SqList *LP);//顺序表的输出
    int ListLength(SqList *LP);//顺序表的长度,即当前元素的个数
    Status ListInsert(SqList *LP,int i,ElemType e);//顺序表的插入操作,在位置i插入元素
    Status GetElem(SqList *LP,int i,ElemType *e);//顺序表的查找操作,返回第i个位置的元素到e中
    Status ListDelete(SqList *LP,int i,ElemType *e);//顺序表的删除操作

1.顺序表的初始化
2.顺序表的创建
3.顺序表的输出
4.顺序表的长度,即当前元素的个数
5.顺序表的插入操作,在位置i插入元素
6.顺序表的查找操作,返回第i个位置的元素到e中
7.顺序表的删除操作

以上表示7个函数声明分别所代表的意义。

接下来我们需要分别编写这7个功能函数,将对应的接口进行连接,最后写出主函数,通过主函数实现调用,完成整个操作。


三.函数功能的编写

1.线性表的初始化,建立了一个空表

void InitList(SqList *LP)
    {
        LP->length=0;
    }

2.创建一个顺序表

void CreateList(SqList *LP,ElemType a[],int n)
    {
        int i;
    for(i=0;i<n;i++)
        {//通过循环将数组元素全部遍历放入顺序表中
        LP->data[i]=a[i];
        LP->length++;
        }
    }

3.输出线性表

void PrintList(SqList *LP)
{
  int i;
  printf("\n顺序表中的元素为:\n");
  for(i=0;i<LP->length;i++)
  printf("%4d",LP->data[i]);
  printf("\n\n");
}

4.线性表的当前长度

void ListLength(SqList *LP)
{
  return LP->length;
}

5./*==========================================================

函数功能的实现:顺序表的运算----元素的插入
函数输入:顺序表的地址,插入值,插入位置
函数输出:完成标志--------0:异常 1:正常

============================================================*/

Status ListInsert(SqList *LP,int i,ElemType e)
{
  int k;
  if(LP->length==MAXSIZE)//顺序表已满
  return 0;
  if(i<1||i>LP->length+1)//插入位置非法
  return 0;
  for(k=LP->length-1;k>=i-1;k--)//从顺序表最后一个元素开始后移
  LP->data[k+1]=LP->data[k];
LP->data[i-1]=e;//将插入的元素放入i-1中
LP->length++;
return 1;
}

6./*==========================================================

函数功能的实现:顺序表的运算----元素的删除
函数输入:顺序表的地址,删除位置,返回删除元素值
函数输出:完成标志--------0:异常 1:正常

============================================================*/

Status ListDelete(SqList *LP,int i,ElemType *e)
{
  int k;
  if(LP->length==0)
  return 0;
  if(i<1||i>LP->length)
  return 0;
  *e=LP->data[i-1];
for(k=i;k<LP->length;k++)
LP->data[k-1]=LP->data[k];
LP->length--;
return 1;
}

7./*==========================================================

函数功能的实现:顺序表的运算----元素的查找
函数输入:顺序表的地址,查找位置,接收查找值的变量(地址)
函数输出:完成标志--------0:异常 1:正常

============================================================*

Status GetElem(SqList *LP)
{
  if(p->length==0||i<1||i>LP->length)
  return 0;
  *e=LP->data[i-1];
  return 1;
}

四.主函数的编写

int main()
  {
    SqList L,*SP;
    int flag;//用于接收函数状态返回或用于接收查找元素
    ElemType result;
    int search;
    ElemType arr[]={12,14,16,24,28,30,42,77};
    SP=&L;
    InitList(SP);//初始化线性表
    CreateList(SP,arr,8);//创建线性表
    PrintList(SP);//输出线性表
    printf("顺序表的当前长度为:%d\n",ListLength(SP));
    //顺序表中插入元素
    printf("在第几个位置插入?\n");
    flag=ListInsert(SP,9,90);
    if(flag==1)
    {
      PrintList(SP);
      printf("顺序表当前长度为:%d\n\n",ListLength(SP));
    }
    else
    {
      printf("顺序表插入失败\n");
      printf("顺序表的当前长度为:%d\n\n",ListLength(SP));
    }
    /*顺序表中查找元素*/
    printf("要查找第几个元素?\n\n");
    scanf("%d",&search);
    flag=GetElem(SP,search,&result);
    if(flag==1)
    printf("第%d个元素是%d\n\n",search,result);
    else
    printf("顺序表查找失败!\n");
    /*顺序表的删除操作*/
    printf("要删除第几个元素?\n");
    scanf("%d",&search);
    flag=ListDelete(SP,search,&result);
    if(flag==1)
    printf("删除的第%d个元素是%d\n\n",search,result);
    else
    printf("顺序表删除失败!\n");
    return 0;
  }

五.函数接口说明

  1. 线性表的初始化
void InitList(SqList *LP);

接口1:SqList *LP

含义:线性表的地址。

  1. 线性表的创建
void InitList(SqList *LP);//顺序表的初始化

接口1:SqList *LP

含义:线性表的地址。

  1. 线性表的输出
void PrintList(SqList *LP);//顺序表的输出

接口1:SqList *LP

含义:线性表的地址。

  1. 线性表的当前长度
int ListLength(SqList *LP);//顺序表的长度,即当前元素的个数

接口1:SqList *LP

含义:线性表的地址。

  1. 线性表的插入操作
Status ListInsert(SqList *LP,int i,ElemType e);//顺序表的插入操作,在位置i插入元素

接口1:SqList *LP线性表的地址

接口2:int i插入的位置

接口3:ElemType e插入的新元素值

  1. 线性表的查找操作
Status GetElem(SqList *LP,int i,ElemType *e);//顺序表的查找操作,返回第i个位置的元素到e中

接口1:SqList *LP线性表的地址

接口2:int i查找到的位置

接口3:ElemType *e返回元素值

  1. 线性表的删除操作
Status ListDelete(SqList *LP,int i,ElemType *e);//顺序表的删除操作

接口1:SqList *LP线性表的地址

接口2:int i要删除的位置

接口3:ElemType *e获得的删除值


六.实现思路




目录
相关文章
|
8天前
简化数据结构的初始化过程
简化数据结构的初始化过程
21 0
|
3天前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
17 6
|
4月前
|
存储 C语言
数据结构中的线性表链式存储介绍及其基本操作
链式存储是线性表的一种重要存储方式,它通过节点和指针的结构,实现了灵活的动态存储管理。本文介绍了单向链表的基本操作,并提供了相应的C语言代码示例。理解和掌握链表的操作对学习和应用数据结构具有重要意义。希望这篇博客能帮助你更好地理解线性表的链式存储。
107 2
|
6天前
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
16 1
|
4天前
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
28 0
|
1月前
|
存储 算法 C语言
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
本文详细介绍了单链表的理论知识,涵盖单链表的定义、优点与缺点,并通过示例代码讲解了单链表的初始化、插入、删除、查找等核心操作。文中还具体分析了按位序插入、指定节点前后插入、按位序删除及按值查找等算法实现,并提供了尾插法和头插法建立单链表的方法,帮助读者深入理解单链表的基本原理与应用技巧。
209 6
|
21天前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
4月前
|
存储 测试技术
【数据结构】操作受限的线性表,栈的具体实现
【数据结构】操作受限的线性表,栈的具体实现
54 5
|
4月前
|
存储 测试技术
【数据结构】操作受限的线性表,队列的具体实现
【数据结构】操作受限的线性表,队列的具体实现
40 4
|
4月前
|
存储 数据挖掘 数据处理
【python源码解析】深入 Pandas BlockManager 的数据结构和初始化过程
【python源码解析】深入 Pandas BlockManager 的数据结构和初始化过程