数据结构——你好,线性表(1)

简介: 数据结构——你好,线性表(1)

线性表的基本概念


线性表的定义


定义:

线性表是零个或多个(n >= 0)具有相同数据类型的数据元素的有限序列.

通常记作:(a1,a2,…,ai-1,ai,ai+1,…,an)。n是表长,n = 0的线性表被称为空表

微信图片_20221017220200.jpg

举个例子微信图片_20221017220206.jpg

特点:

在线性表中相邻元素之间存在顺序关系。即,对于元素ai而言,ai-1称为ai的直接前驱,ai+1称为ai的直接后继。

微信图片_20221017220309.jpg

故,除了开始结点(a1)和终端结点(an)以外,其余所有结点都有且仅有一个直接前驱和一个直接后继


线性表的基本操作


  1. 初始化线性表InitList(L)
  2. 求线性表长度GetLength(L)
  3. 按位置查找操作GetElem(L,i,x)
  4. 按值查找操作Locate(L,x)
  5. 插入操作InsElem(L,i,x)
  6. 删除操作DelElem(L,i,x)
  7. 显示操作DispList(L)


线性表的顺序存储


顺序表


线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表中的数据元素


顺序表基本运算的实现


顺序表类型定义


简单来说,线性表的顺序存储结构就是在内存中找一块地儿,把它占了,然后把相同数据类型的数据元素依次存放在这块空地中,所以可以直接用一个一维数组实现线性表的顺序存储结构

#define MAXLEN 100      //定义常量MAXLEN = 100用于表示存储空间的总量
typedef int DataType;   //定义DataType为int型
typedef struct{       //顺序表存储类型 
  DataType data[MAXLEN]; //存放线性表的数组 
  int Length;       //Length表示当前线性表的中长度 
}SeqList; 
SeqList L;          //定义一个顺序表,名字是L,同时它也是全局变量 

顺序表SeqList是一个结构体类型,它由两个成员组成:data表示存储数据的数据和表示线性表当前实际的长度的Length


顺序表的初始化


初始化也就把线性表回到最初表长是0的状态,通过将记录线性表实际长度的Length置为0实现

void InitList(SeqList *L) 
{
  L->Length = 0;      //初始化顺序表为空 
}

顺序表的建立


从键盘录入n个数据,并将这些数据存入到顺序表中,修改表长

void CreateList(SeqList *L,int n)
{
  int i;
  printf("请输入%d个整数:",n) ;
  for(i = 0; i < n;i++)
    scanf("%d",&L->data[i]);
  L->Length = i;       //更新表长 
} 

查找操作


注意:顺序表中的位置是从1开始计数的,联系到日常生活中,说的是第1个位置,第2个位置,也没有说第0个位置的说法吧~。

但是用来记录顺序表的数组是0开始计数的


按位置查找


查找顺序表中第i个位置元素的值,在i无效时返回出错,有效是返回成功,并用指针x所指向的变量传回第i个元素的值

int GetElem(SeqList *L,int i,DataType *x) 
{
  //异常处理
  if(i < 1 || i >L->Length)  return 0;
  else
  {
    *x = L->data[i-1];//顺序表中的位置是从1开始计算的
    return 1; 
  }
}

按值查找


在顺序表中查找与给定的x相等的数据元素的位置的所在位置。

int Locate(SeqList *L,DataType x)
{
  int i = 0;
  while(i < L->Length && L->data[i] != x) i++;
  if(i >= L->Length) return 0;
  else return i+1;
}

插入操作

微信图片_20221017221024.jpg

实现思路:

  1. 特判。当插入的位置不合理了,抛出异常
  2. 将ai~an之间的所有结点依次后移,为新元素让出第i个位置
  3. 将新结点x插入到第i个位置
  4. 修改表长

参考实现代码:

int InsElem(SeqList *L,int i,DataType x)
{
  int j;
  //异常处理
  //表满了,不能插入了 
  if(L->Length >= MAXLEN) 
  {
    printf("顺序表已满,无法插入");
    return -1;
  }
  //提供的插入位置不合法
  if(i < 1 || i > L->Length+1) 
  {
    printf("插入位置出错,无法插入");
    return 0;
  }
  //插入位置在表尾,直接插入即可 
  if(i == L->Length+1)
  {
    L->data[i-1]  = x;
    L->Length++;
    return 1;
  } 
  //插入到表中某个位置,则插入点后各个结点后移。
  //可以取巧从末尾开始移动,那么每次都只用移动一位,不用每次都移动n-i位  
  for(j = L->Length-1;j >= i-1;j--) 
  {
    L->data[j+1] = L->data[j];
    L->data[i-1] = x;
    L->Length ++;
    return 1;
  }
}

删除操作

微信图片_20221017221114.jpg

 

实现思路:

  1. 将要删除的元素值,赋值给指针x所指的变量,需要这数据时就可以及时获得
  2. 将ai+1~an之间的结点依次向前移动
  3. 顺序表长度减1

参考实现代码:

int DelElem(SeqList *L,int i,DataType *x) 
{
  int j;
  // 异常处理 
  //顺序表为空 
  if(L->Length == 0)
  {
    printf("顺序表为空,无法删除");
    return 0;
  }
  //给定删除位置不合法
  if(i < 1 ||i > L->Length) 
  {
    printf("不存在第i个元素");
    return 0;
  }
  *x = L->data[i-1];// 用指针变量*x存储删除元素的值,用于返回
  //移动数组,覆盖要删除的元素 
  for(j = i; j < L->Length;j++) L->data[j-1]  = L->data[j];
  //更新线性表长度
  L->Length--;
  return 1; 
}

输出顺序表中数据


因为顺序表本质是数组,所以输出数据就是简单遍历数组就可以啦~

void DispList(SeqList *L) 
{
  int i = 0;
  for(i =0;i< L->Length;i++) printf("%d ",L->data[i]);
}
相关文章
|
6月前
|
存储 C语言
数据结构中的线性表链式存储介绍及其基本操作
链式存储是线性表的一种重要存储方式,它通过节点和指针的结构,实现了灵活的动态存储管理。本文介绍了单向链表的基本操作,并提供了相应的C语言代码示例。理解和掌握链表的操作对学习和应用数据结构具有重要意义。希望这篇博客能帮助你更好地理解线性表的链式存储。
145 2
|
2月前
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
47 6
|
2月前
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
28 1
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
6月前
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
55 0
|
2月前
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
87 0
|
2月前
|
存储 C语言
数据结构之线性表的初始化及其操作
数据结构之线性表的初始化及其操作
49 0
|
3月前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
6月前
|
存储 测试技术
【数据结构】操作受限的线性表,栈的具体实现
【数据结构】操作受限的线性表,栈的具体实现
75 5
|
6月前
|
存储 测试技术
【数据结构】操作受限的线性表,队列的具体实现
【数据结构】操作受限的线性表,队列的具体实现
52 4