1.线性表定义:0个或多个数据元素的有限序列。
2.线性表的顺序存储结构:是指用一段地址连续的存储单元依次存储线性表的数据元素。
3.线性表的顺序存储结构通常可借助数组实现。
注意:①一般,数组长度固定;线性表长度可变。因此,用数组存放线性表数据时,定义的数组大小要大于等于线性表长度。②线性表中的元素从1开始数,数组下标从0开始,因此,数组a[0]存放线性表的第1个数,同理,a[i]存放第i+1个数。
4.线性表顺序存储结构的优缺点:
5.代码实现:
#include <stdlib.h>
#include <iostream>
/************************************************************************/
/* (1)线性顺序存储:地址连续 */
/************************************************************************/
#define MaxSize 20 //存储空间初始分配量
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status; //Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int ElemType; //元素类型依据实际情况决定
Status visit(ElemType c)
{
printf("%d",c);
return OK;
}
typedef struct //定义SqList线性表结构
{
ElemType data[MaxSize];
int length;
}SqList;
//初始化顺序线性表
Status InitList(SqList *L)
{
L->length=0;
return OK;
}
/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,返回true;否则返回false*/
Status ListEmpty(SqList L)
{
if(L.length == 0)
return TRUE;
else
return FALSE;
}
/* 初始条件:顺序线性表已经存在。操作结果:将L重置为空表*/
Status ClearList(SqList *L)
{
L->length=0;
return OK;
}
/* 初始条件:L顺序线性表L已经存在。操作结果:返回L中数据元素的个数*/
int ListLength(SqList L)
{
return L.length;
}
/* 初始条件:顺序线性表L已经存在,1=<i<=ListLength(L)*/
/* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第一个位置下标从0k开始*/
Status GetElem(SqList L,int i,ElemType *e)
{
if(L.length==0 ||i<1 || i>L.length)
return ERROR;
*e = L.data[i-1];
return OK;
}
/* 初始条件:顺序线性表L已经存在*/
/* 操作结果:返回L中第一个与e满足关系的数据元素的位序;若这样的元素不存在,则返回0*/
int LocateElem(SqList L,ElemType e)
{
int i;
if (L.length == 0)
return 0;
for (i=0;i<L.length;i++)
{
if (L.data[i] ==e)
break;
}
if (i>=L.length)
return 0;
return i+1;
}
/* 初始条件:顺序线性表L已经存在,1<=i<=ListLength(L)*/
/* 操作结果:在L中的第i个位置之前插入新的元素e,L的长度加1*/
Status ListInsert(SqList *L, int i,ElemType e)
{
int k;
if(L->length == MaxSize)
return ERROR;
if (i<1 || i>L->length +1) //插入的位置i比第一个位置小、或比最后一个位置大
return ERROR;
if (i<=L->length)
{
for (k=L->length-1;k>=i-1;k--)
{
L->data[k+1] = L->data[k];//位置i及其后面的元素统一后移一位
}
}
L->data[i-1]=e; //插入新元素
L->length++;//线性表长度加1
return OK ;
}
/* 初始条件:顺序线性表L已经存在,1<=i<=ListLength(L)*/
/* 操作结果:删除第i个数据元素,并用e返回其值,L的长度减1*/
Status ListDelete(SqList *L,int i,ElemType *e)
{
if (L->length == 0)
return ERROR;
if (i<1 || i>L->length+1)
return ERROR;
*e=L->data[i-1];
if (i<=L->length)
{
for(int k=i-1;k<L->length-1;k++)
L->data[k]=L->data[k+1];
}
L->length--;
return OK;
}
/* 初始条件:顺序线性表L已经存在*/
/* 操作结果:依次对L的每个数据元素输出*/
Status ListTravese(SqList L)
{
int i;
for (i=0;i<L.length;i++)
visit(L.data[i]); //这个visit函数是在最开始自定义的打印输出函数
printf("\n");
return OK;
}
//将两个顺序线性表组合为一个线性表
void unionL(SqList *La,SqList Lb)
{
int La_len,Lb_len,i;
ElemType e;
La_len=La->length;
Lb_len=Lb.length;
for(int i=0;i<Lb_len;i++)
{
GetElem(Lb,i,&e);
if (!LocateElem(*La,e))
{
ListInsert(La,++La_len,e);
}
}
}
int main()
{
SqList L;
ElemType e;
Status i;
int j,k;
i=InitList(&L);
printf("初始化L之后:L.length=%d",L.length);
printf("\n");
for(j=1;j<=5;j++)
i=ListInsert(&L,1,j);
printf("在表头依次插入1~5之后:L.data=\n");
ListTravese(L);
/*for(int k=0;k<L.length;k++)
printf("%d",L.data[i]);*/
printf("L.length=%d\n",L.length);
printf("\n");
i=ListEmpty(L);
printf("L是否为空:i=%d(1:是;0:否)\n",i);
i=ClearList(&L);
printf("清空L后:L.length=%d\n",L.length);
i=ListEmpty(L);
printf("判断L是否为空i=%d\n",i);
for(j=1;j<=10;j++)
ListInsert(&L,j,j);
printf("在对应位置依次插入1~10之后,L.data=");
ListTravese(L);
printf("\n");
printf("L.length=%d\n",L.length);
ListInsert(&L,1,2);
printf("在表头插入0后,L.data=");
ListTravese(L);
printf("\n");
printf("L.length=%d\n",L.length);
GetElem(L,5,&e);
printf("第5个元素是:%d\n",e);
getchar();
}