顺序表详解

简介: 顾名思义,按照顺序方式存储的线性表称为顺序表。顺序表中的每个数据元素(存储位置连续)按其顺序有唯一的索引值(下标值)来访问数据元素的内容。顺序表是一种具有很高存取效率的随机存取结构。

👁‍🗨👁‍🗨1. 顺序表简介

顾名思义,按照顺序方式存储的线性表称为顺序表。

顺序表中的每个数据元素(存储位置连续)按其顺序有唯一的索引值(下标值)来访问数据元素的内容。

顺序表是一种具有很高存取效率的随机存取结构。

👁‍🗨👁‍🗨2. 顺序表定义

用数组来实现线性表的顺序存储结构比较适合,下图是顺序表简单示意图:

a1 a2 a3 a... an
data[0] data[1] data[2] data[n-1]
👁‍🗨👁‍🗨3. 顺序表的优缺点

优点:

结构简单,利于理解。

方便随机访问表中的每个元素。

不需要再为结点间的逻辑关系而增加额外的储存空间。

缺点:

顺序表的存储空间不易扩充。

顺序表易造成储存空间利用率低(空间大小需自行设定)。

顺序表插入删除运算效率低,耗时长。

👁‍🗨👁‍🗨4. 顺序表应用

首先要定义声明一个结构体和宏

include <stdio.h>

include <stdlib.h>

include <assert.h>

define Maxsize 100

typedef struct SeqList
{

int data[Maxsize];
int last;

}SeqList;
结构体以last定义一个记录元素个数(顺序表长度)的变量,对于顺序表的增删统计长度的大小。

初始化顺序表

SeqList* Init_SeqList()
{
SeqList L=(SeqList)malloc(sizeof(SeqList));
assert(L); //判断L是否成功开辟
L->data[0]=0;
L->last=0; //初始化,这里初始化成-1也可以。具体情况自行决定
return L;
}
顺序表的插入(只能在尾部插入)

void Insert_SeqList(SeqList* L,int x, int data)
{
if(x>Maxsize)
{printf("顺序表已满\n");
exit(1);
}
if(x<0)
{
printf("输入位置无效");
exit(1);
}
L->data[x]=data;
L->last++;
}
此种算法看似简单,但是有很大的局限性,当输入位置重复时,会得到错误的结果。

改进方法如下:

顺序表的插入(任意位置)

void Insert__SeqList(SeqList* L,int x, int data)
{

int j;
if(L->last>=Maxsize)
    exit(1);
if(x<0||x>L->last)
    exit(1);
for(j=L->last;j>=x;j--)
{

    L->data[j+1]=L->data[j];
}
L->data[x]=data;
L->last++;

}

当输入位置重复时,该位置即往后的数就会自动向后移动。从而插入新的数字。

顺序表的删除(任意位置)

void Delete_SeqList(SeqList* L,int i)
{
if(i>Maxsize|| i<0)
{
printf("输入位置无效");
exit(1);
}
else
{
while(i+1!=Maxsize)
{
L->data[i]=L->data[i+1];
i++;
}
}
L->last--;
}

删除函数,也要把后面的数一个一个的往前移。时间复杂度为o(n)

要点:记住删除之后数组的长度要进行减一操作。

查找函数

void research(SeqList* L, int i)
{

if(i>L->last|| i<0)
{
    printf("输入位置无效");
    exit(1);
}

printf("\n查找的该位置数据为:%d ",L->data[i]);

}
无需遍历查找,也体现了顺序表的优越处,时间复杂度为O(1)

打印函数

void print_SeqList(SeqList*L)
{
int i=0;
for(i=0;ilast;i++)
{

  printf("%d ",L->data[i]);

}
printf("\n顺序表中元素个数为:%d",L->last);

}
打印函数就是遍历一遍数组就可以。

后面就是主函数进行调用了。

int main()
{
SeqList* L=Init_SeqList();
/*Insert_SeqList(L,0,5);
Insert_SeqList(L,1,7);
Insert_SeqList(L,2,6);
Insert_SeqList(L,3,9);
Insert_SeqList(L,4,7);*/
int i,j,x;
for(i=0;i<4;i++)
{

printf("输入插入位置");
scanf("%d",&j);
printf("输入插入数据");
scanf("%d",&x);
//Insert_SeqList(L,j,x);
Insert__SeqList(L,j,x);

}
//Delete_SeqList(L,1);
print_SeqList(L);
//research(L, 2);
return 0;

}

这有两种插入方式,第一种就是一个一个输入,要提前把要插入的数字写好,

第二种方式就是利用一个循环,可以从控制台输入数字。

目录
相关文章
|
6月前
|
存储 测试技术 C语言
顺序表详解(SeqList)
顺序表详解(SeqList)
176 0
|
存储
【顺序表】
【顺序表】
51 0
|
5月前
|
算法
顺序表的应用
顺序表的应用
37 5
|
5月前
|
存储 算法
顺序表专题
顺序表专题
40 4
|
5月前
|
存储
25.顺序表专题
25.顺序表专题
|
6月前
|
存储
顺序表讲解
顺序表讲解
49 0
|
6月前
顺序表的实现
顺序表的实现
|
测试技术
顺序表(2)
顺序表(2)
549 0
|
存储 C语言
顺序表(1)
顺序表(1)
77 0
|
存储 NoSQL
03 顺序表
03 顺序表
32 0