标签:size 代码实现 时间复杂度 缺点 地址 抽象 变化 type 集合
定义:由零个或多个数据元素组成的有限序列
(1.首先它是一个序列,也就是说元素之间是有先来后到的。2.若元素存在多个,则第一个元素无前驱,而最后一个元素无后继。3.list是有限的)
定义:一个数学模型以及定义在此数学模型上的一组操作。 (类=属性+方法)
描述
ADT 抽象数据类型名
Data
数据元素之间逻辑关系的定义
Operation
操作
endADT
ADT List
Data
线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。
Operation
InitList(*L):初始化,建立一个空的线性表L。
ListEmpty(L):判断
ClearList(*L):清空
GetElem(L,i,*e):将线性表L中的第i个位置元素值返回给e。
LocateElem(L,e):在线性表L中查找于给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。
ListInsret(*L,i,e):第i个位置插入新元素e
ListDelete(*L,i,*e):。。。
ListLength(L):返回长度
endADT
void unionL(List *a, List b)
{
int len_a, len_b, i;
ElemType e;
len_a=ListLengh(*a);
len_b=ListLengh(b);
for(i=1;i<=len_b;i++)
{
GetElem(b,i,&e);
if( !LocateElem(*a,e)
{
ListInsert(a, i ,e);
}
}
}
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int length; // 线性表当前长度
} Sqlist;
由此可见,顺序存储结构封装需要三个属性:
注意:数组的长度是存放线性表的存储空间的总长度,一般初始化后不变(动态数组可变)。而线性表的当前长度是线性表中元素的个数,是会变化的。
数组从0开始计算,线性表从1开始。
假设ElemType占用的是c个存储单元(字节),线性表中第i+1个元素和第i个数据元素的存储位置的关系是:LOC(ai+1)= LOC(ai) + c
算法思路
Status ListInsert(SqList *L, int i, ElemType e) //status表示函数的类型,返回的是函数的状态
{
int k;
if(i<1||i>L->length+1){
return error;
}
if(L->length==MAXSIZE){
return error;
}
if(ilength)//不在表尾
{
for(k=L->length-1;k>=i-1;k--){
L->data[k+1]=L->data[k];
}
}
L->data[i-1]=e;
L->length++;
return OK;
}
Status ListInsert(SqList *L, int i, ElemType e) //status表示函数的类型,返回的是函数的状态
{
int k;
if(L->length==0)
{
return error;
}
if(i<1||i>L->length){
return error;
}
*e= L->data[i-1];//因为数组是从0开始索引的,所以线性表中的i-1号文章才是
if(ilength )//不在表尾
{
for(k=i; k < L->length; k++){
L->data[k-1]=L->data[k];
}
}
L->length--;
return OK;
}
存、读数据时,不管那个位置,时间复杂度都是O(1),而在插入或删除时,时间复杂度为O(n)(在表尾时,时间复杂度为O(1)).
这就说明它比较适合元素个数比较稳定,不经常插入和删除元素,而更多时存取数据。
(链式存储)每个数据需要两个存储空间
把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或链。这两部分信息组成数据元素称为存储映像,称为节点(Node)。
typedef struct Node
{
ElemType data;
struct Node Next;
} Node;
typedef struct Node LinkList;
获取链表第i个数据的算法思路
Status GetElem(LinkList L, int i, ElemType *e)
{
int j;
LinkList p;// p是个指针
p=L->next;
j=1;
while(p && j< i )
{
p=p->next;
j++;
}
if(!p||j>i)
{
return ERROR;
}
*e=p->data;
}
return OK;
}
标签:size 代码实现 时间复杂度 缺点 地址 抽象 变化 type 集合
原文地址:https://www.cnblogs.com/elong1995/p/10886927.html