👁🗨👁🗨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;
}
这有两种插入方式,第一种就是一个一个输入,要提前把要插入的数字写好,
第二种方式就是利用一个循环,可以从控制台输入数字。