【数据结构】C语言实现顺序表的相关操作

顺序表

定义

顺序表:在内存中用地址连续的一块存储空间顺序存放线性表的各元素,用这种存储形式存储的线性表称为顺序表

线性表:具有相同特性的数据元素的一个有限序列。

表示

#define MAXSIZE 100
typedef int ElemType;
typedef struct SeqList {
ElemType data[MAXSIZE];
int length;
}SeqList;

ElemType data[MAXSIZE]:data数组,用于存放数据

length:记录数组中存放数据的个数

也可以这样表示

#define MAXSIZE 100
typedef int ElemType;
typedef struct SeqList {
ElemType* data;
int length;
}SeqList;

两种表示方式差别不大,以下代码都是基于第一种表示方式

初始化

初始化函数

参数:顺序表的地址

void init(SeqList* L)
{
int i = 0;
for (i = 0; i < MAXSIZE; i++)
{
L->data[i] = 0;
}
L->length = 0;
}

也可以在主函数中直接初始化

SeqList L = { {0},0 };

插入

在这里插入图片描述

数据是按存储空间的顺序存入到内存中,插入的位置是在已有数据的内存之间或者之后的第一个内存空间

假设有1到10的空间,那么第一个插入的位置只能是1,第二个插入的位置可以是1到2,第三个插入的位置可以是1到3,第四个1到4,第五个…

插入函数

把从第 location 个位置开始的数据依次后移

参数:顺序表的地址,插入的位置,插入的数据

返回值:1表示插入成功,0表示插入失败

int insert(SeqList* L, int location, ElemType x)
{
if (L->length == MAXSIZE)
{
//printf("表满,无法插入新元素\n");
return 0;
}
if (location < 1 || location > MAXSIZE)
{
//printf("插入的位置不合适\n");
return 0;
}
int i = L->length;
for (i = L->length; i >= location; i--)
{
L->data[i] = L->data[i - 1];
}
L->data[location - 1] = x;
L->length++;
return 1;
}

当 location = L->length + 1时,插入的位置是表尾后的第一个空间时(在上图中,就是位置7),for循环不会执行

int i = L->length;
for (i = L->length; i >= location; i--)
{
L->data[i] = L->data[i - 1];
}
L->data[location - 1] = x;
L->length++;

也可以这么写,都是一样的

if (location == L->length + 1) //插入表尾之后的第一个空间,直接插入,无需移动数据
{
L->data[location - 1] = x;
}
else //插入其他位置,需要移动数据
{
int i = L->length;
for (i = L->length; i >= location; i--)
{
L->data[i] = L->data[i - 1];
}
L->data[location - 1] = x;
}

删除

删除函数

删除 location 位置上的数据,然后把从第 location + 1 位置开始的数据依次前移

参数:顺序表的地址,删除的位置

返回值:1表示插入成功,0表示插入失败

int del(SeqList* L, int location)
{
if (L->length == 0)
{
//printf("表空,无法删除元素\n");
return 0;
}
if (location < 1 || location > MAXSIZE)
{
//printf("删除的位置不合适\n");
return 0;
}
int i = 0;
for (i = location - 1; i <= L->length - 2; i++)
{
L->data[i] = L->data[i + 1];
}
L->length--;
return 1;
}

按值查找

查找函数

在顺序表上查找第一个和 x 值相等的元素,若查找成功,返回它在顺序表中的位置 ,否则,返回0。这里的位置不是下标。

参数:顺序表的地址,查找的值

返回值:返回值为 x 在顺序表中第一次出现的位置,返回0则表示找不到

int search(SeqList* L, ElemType x)
{
int i = 0;
for (i = 0; i < L->length; i++)
{
if (L->data[i] == x)
{
return (i + 1);
}
}
return 0;
}

清空

清空函数

将顺序表清空

参数:顺序表的地址

void clear(SeqList* L)
{
L->length = 0;
}

顺序表中的所有数据还是原来的数据,把顺序表中 length 的值设为0,就可以对原来的数据进行修改

顺序结构的缺点

  1. 插入和删除操作需要移动大量的数据
  2. 在实际的系统中缺少大块可利用的空间
posted @   长白秋沙  阅读(63)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示