线性表的定义
- 定义:零个或多个数据元素的有限序列
- 特点:
A.它是一个序列
a.数据元素之间是有序的
b.数据元素之间是一对一的关系
B.有限性
(零个数据元素的有限序列又称为空表)
线性表的抽象数据类型
线性表的常见操作:删除,插入,创建和初始化,查找,清空
ADT 线性表(sequencelist)
DATA
1.线性表数据元素是一个集合(a_1,a_2,a_3,…,a_n),数据元素的类型datatype(int,char,自定义)
2.除了第一个元素a_1外,每个元素有且只有一个直接的前驱元素
3.除了最后一个元素a_n外,每个元素有且只有一个直接的后继元素
4.每个数据元素之间的关系是一对一的关系
Operation
- initlist(*list)
初始化线性表:创建一个空的线性表list- insertelement(*list,index,elem)
在线性表list的index下标插入元素elem- deleteelement(*list,index,*elem)
删除线性表list中第i个元素,并返回删除元素的指针elem- getlenth(list)
返回线性表list中的元素个数- isempty(list)
若线性表为空,返回true,否则返回false- clearlist(*list)
清空线性表- exsitelem(*list,elem)
在线性表L中查找是否存在数据元素elem,存在则返回该元素在表中的下标,不存在返回-1- getelem(list,index,*elem)
将线性表List中第i个位置的数据元素返回给elemendADT
顺序存储结构的线性表–顺序表
- 线性表(a1,a2,a3,…,ai-1,ai,…,an)的顺序存储示意图如下:
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素 - 描述线性表的顺序存储结构需要三个属性
A.定义线性表的最大存储空间
B.定义数据元素
C.定义顺序表表结构
#define max_size 255
typedef int elemtype;
typedef struct
{
elemtype datas[max_size];
int length;
char *name;
...
}elemtype;
- 地址计算方法
(position 位置从1开始)
(index下标从0开始)
顺序存储结构的插入与删除
- 顺序表插入数据元素
- 将数据元素a插入到顺序表下标为i的位置
下标为i及下标为i以后的所有数据元素后移
下标i的位置直接放入数据元素a
#include <stdio.h>
#include <string.h>
#define max 255
//1.定义数据元素
typedef struct
{
int id;
char *name;
}elementtype;
//2.定义顺序表结构
typedef struct
{
elementtype data[max];
int length;
}Seqlist;
/**
*初始化顺序表
*seqlist要初始化的顺序表
*elemarray初始化时要添加的元素内容数组
*length 初始化时添加的元素个数
*/
void initlist(Seqlist *seqlist,elementtype *elementarray,int length);
/**
*向顺序表中的index下标处插入某个元素
*seqlist要初始化的顺序表
*index 要插入的下标
*element要插入的元素
*/
void insertlist(Seqlist *seqlist,int index,elementtype element);
/**
*打印出相应数组
*/
void printflist(Seqlist *seqlist);
void insertlist(Seqlist *seqlist,int index,elementtype element)
{
//1.验证插入后的元素空间是否超过max
//2.index的值是否合法[0,max]
//3.插入的index应该在length之内
//4.从第length i个下标开始,前面一个元素赋值给后面一个元素
if(seqlist->length+1>=max)
{
printf("数组已满插入失败\n");
return;
}
if(index<0||index>max-1)
{
printf("只能在允许的下标范围内插入元素[0,%d]\n",max-1);
return;
}
if(index>seqlist->length)
{
printf("插入的下标超过了数组的最大长度-1,插入失败\n");
return;
}
for(int i=seqlist->length-1;i>=index;i--)
{
seqlist->data[i+1]=seqlist->data[i];
}
seqlist->data[index]=element;
seqlist->length++;
}
void initlist(Seqlist *seqlist,elementtype *elemarray,int length)
{
if(length>max)
{
printf("超出了数组的最大容量,初始化失败\n");
}
seqlist->length=0;
for(int i=0;i<length;i++)
{
insertlist(seqlist,i,elemarray[i]);
}
}
void printflist(Seqlist *seqlist)
{
for(int i=0;i<seqlist->length;i++)
printf("%d\t%s\n",seqlist->data[i].id,seqlist->data[i].name);
}
elementtype dataarray[]={
{1,"奇异博士"},
{2,"美国队长"},
{3,"小鱼"},
{4,"66"}
};
void test();
void test()
{
Seqlist seqlist;
initlist(&seqlist,dataarray,sizeof(dataarray)/sizeof(dataarray[0]));
printflist(&seqlist);
}
int main()
{
test();
return 0;
}