1、定义
线性表(List):零个或者多个数据元素的有限序列
2、线性表的抽象数据类型
类型名称:线性表(List)
数据对象集:线性表是 n (≥0)个元素构成的有序序列( a1, a2, ,an)
操作集:线性表L List,整数i表示位置,元素X ElementType,线性表基本操作主要有:
1、List MakeEmpty():初始化一个空线性表L;
2、ElementType FindKth( int K, List L ):根据位序K,返回相应元素 ;
3、int Find( ElementType X, List L ):在线性表L中查找X的第一次出现位置;
4、void Insert( ElementType X, int i, List L):在位序i前插入一个新元素X;
5、void Delete( int i, List L ):删除指定位序i的元素;
6、int Length( List L ):返回线性表L的长度n。
3、线性表的顺序存储结构
#deffine MAXSIZE 20
typedef struct LNode *List;
struct LNode{
ElementType Data[MAXSIZE];
int Last;
};
struct LNode L;
List PtrlL;其中:
访问下标为i的元素:PtrL.Data[i]或者Ptrl->Data[i]
数组的长度:PtrL.Last+1或者PtrL->Last+1
注意:线性表的长度是线性表中数据元素的个数,数组的长度是存放线性表的存储空间的长度,一般而言,线性表的长度应该小于等于数组的长度。
操作:
//初始化
List MakeEmpty(){
List PtrL;
PtrL=(List)malloc(sizeof(struct LNode));
PtrL->Last = -1;
return PtrL;
}
//查找 时间性能 O(n)
int Find(ElementType X,List PtrL){
int i =0;
while (i <=PtrL->Last&&PtrL->Data[i]!=X) {
i++;
}
if(i > PtrL->Last) //未找到,返回-1
return -1;
else return 1;
}//c插入
void Insert(ElementType X,int i,List PtrL){
int j;
if(PtrL->Last == MAXSIZE -1){//表空间已满,不能插入
printf("表满");
return;
}
if(i <1||i>PtrL->Last+2){
printf("位置不合法");
return;
}
for(j=PtrL->Last;j>=i-1;j--){
PtrL->Data[j+1]=PtrL->Data[j];
}
PtrL->Data[i-1]=X;
PtrL->Last++;
return ;
}
平均移动次数n/2,时间复杂度O(n)
//c插入
void Insert(ElementType X,int i,List PtrL){
int j;
if(PtrL->Last == MAXSIZE -1){//表空间已满,不能插入
printf("表满");
return;
}
if(i <1||i>PtrL->Last+2){
printf("位置不合法");
return;
}
for(j=PtrL->Last;j>=i-1;j--){
PtrL->Data[j+1]=PtrL->Data[j];
}
PtrL->Data[i-1]=X;
PtrL->Last++;
return ;
}
平均移动次数(n-1)/2,时间复杂度O(n)
4、线性表的连式存储结构
节点由存放数据元素的数据域和存放后继节点地址的指针域组成。上图 用p指向a1的话p->data=a1,p->next->data=a2,
typedef struct Lnode *List;
struct Lnode{
ElementType Data;
List Next;
};
struct Lnode L;
List PtrL;
//求表长
int Length(List Ptrl){
List p = PtrL;//p指向表的第一个节点
int j = 0;
while(p){
p=p->next;
j++;
}
return j;
}时间复杂度O(n)
//查找按序号
List FindKth(int K,List PtrL){
List p =PtrL;
int i =1;
while (p!=null&&i<K) {
p=p->next;
i++;
}
if(i=K)
return p; //找到底K个
else
return NULL; //否则返回为空
}
//按值查找
List Find(ElemenType X,List PtrL){
List P=PtrL;
while (平!=NULL&&PtrL->next !=X) {
p=p->next;
}
return p;
}//删除
List Delete(int i,List PtrL){
List p,s;
if(i ==1){//若删除的是第一个节点
s=PtrL;
if(PtrL != NULL)PtrL=PtrL->next;
else return NULL;
free(s);
return PtrL;
}
p= FindKth(i-1,PtrL);
if(p == NULL){
printf("第%d个节点不存在",i-1);
return NULL;
}else if(p->next == NULL){
printf("第%d个节点不存在",i);
return NULL;
}else{
s=p->next;
p->next=s->next;
free(s);
return PtrL;
}
}
广义表

本文介绍了线性表的概念,包括它的定义、抽象数据类型以及线性表的基本操作,如初始化、查找、插入、删除等。接着讨论了线性表的两种存储结构——顺序存储和链式存储,分析了各自的访问方式和特点。
2933

被折叠的 条评论
为什么被折叠?



