打卡第一天——线性表基本运算
在数据元素的非空有限集中,
(1)存在唯一的一个被称做“第一个”的数据元素;
(2)存在唯一的一个被称做“最后一个”的数据元素;
(3)除第一个之外,集合中的每个数据元素均只有一个前驱
(4)除最后一个之外,集合中每个数据元素均只有一个后继。
线性表是最常用且最简单的一种数据结构。
一个线性表是n个数据元素的有限序列。
数据元素可以是一个数、一个符号、也可以是一幅图、一页书或更复杂的信息。
1、抽象数据类型线性表的定义如下:
ADT List{
数据对象: D={ai| ai∈ElemSet,i=1,2,…,n,n>=0}
数据关系: R1={
基本操作:
InitList(L); //初始化线性表
DestroyList(L); //销毁线性表
ListEmpty(L); //判断线性表是否为空
ListFull(L); //判断线性表是否已满
ListLength(L); //求线性表的长度
GetElem(L,i); //获取线性表L第i个位置的元素
LocateElem(L,e); //获取元素e在线性表L中所在的位置
PriorElem(L,cur_e); //求元素cur_e的直接前驱
NextElem(L,cur_e); //求元素cur_e的直接后继
ListInsert(L,i,e); //在线性表L的第i个位置插入元素e
ListDelete(L,i); //删除线性表L第i个位置的元素
}ADT List
用一组地址连续的存储单元依次存储线性表的数据元素。C语言中的数组即采用顺序存储方式。
假设线性表的每个元素需占用n个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置。则存在如下关系:
LOC(ai+1)=LOC(ai)+n
LOC(ai)=LOC(a1)+(i-1)*n
式中LOC(a1)是线性表的第一个数据元素的存储位置,通常称做线性表的起始位置或基地址。常用b表示。
线性表的这种机内表示称做线性表的顺序存储结构或顺序映象。
称顺序存储结构的线性表为顺序表。顺序表的特点是以元素在计算机内物理位置相邻来表示线性表中数据元素之间的逻辑关系。
#define maxlen 100
typedef int ElemType;
typedef struct list{
ElemType elem[maxlen+1]; //这里规定从1号元素放起
int realen; //实际存放的数目
}List;
bool ListInsert(List &L,int i, ElemType e){
//此函数将元素e插入指定位置i
if ((i<=0) || (i>L.realen+1) || (L.realen>=maxlen))
return ERROR;
for (k=L.realen+1;k>=i+1;k–)
L.elem[k]=L.elem[k-1];
L.elem[i]=e; L.realen++;
return OK;
}
bool ListDelete(List &L ,int i){
//此函数将插入指定位置i处的元素删除
if ((i<=0) || (i>L.realen))
return ERROR;
for (k=i;k
L.realen–;
return OK;
}
1、基本操作为:移动元素
2、一个基本假设:每个位置元素被删除的概率相等,均为1/n
3、结论:平均移动次数为(n-1)/2,故时间复杂度为O(n)。
#include
#include
#define MAXSIZE 1024
typedef struct
{
int data[MAXSIZE];//存储顺序表中的元素
int len;//顺序表类型
}SeqList;//顺序表类型
SeqList *Init_SeqList()//顺序表初始化
{
SeqList *L;
L=(SeqList*)malloc(sizeof(SeqList));
L->len=0;
return L;
}
void CreatList(SeqList **L)//建立顺序表
{
int i,n;
printf("Input length of List:");
scanf("%d",&n);
printf("Input elements of List:\n");
for(i=1;i<=n;i++)
scanf("%d",&(*L)->data[i]);
(*L)->len=n;
}
void Insert_SeqList(SeqList *L,int i,int x)//在顺序表中插入元素
{
int j;
if(L->len==MAXSIZE-1)//表满
printf("The List is full!\n");
else
if(i<1||i>L->len+1)//插入位置非法
printf("The position is invalid!\n");
else
{
for(j=L->len;j>=i;j--)//将an~ai顺序后移一个元素位置
L->data[j+1]=L->data[j];
L->data[i]=x;//插入x到第i个位置
L->len++; //表长增1
}
}
void Delete_SeqList(SeqList *L,int i)//顺序表中删除元素
{
int j;
if(L->len==0)//表为空
printf("The List is empt!\n");
else
if(i<1||i>L->len)//删除的位置非法
printf("The position is invalid!\n");
else
{
for(j=i+1;j<=L->len;j++)//将ai+1~an顺序前移一个位置实现对ai的删除
L->data[j-1]=L->data[j];
L->len--;//表长减1
}
}
int Location_SeqList(SeqList *L,int x)//在顺序表中查找元素
{
int i=1;//从第一个元素开始查找
while(i<L->len&&L->data[i]!=x)//从顺序表未查找完且当前元素不是要找的元素
i++;
if(L->data[i]==x)
return i;//找到返回其位置
else
return 0;//未找到返回0
}
void print(SeqList *L)//顺序表的输出
{
int i;
for(i=1;i<=L->len;i++)
printf("%2d",L->data[i]);
printf("\n");
}
int main()
{
SeqList *s;
int i,x;
s=Init_SeqList();//顺序表初始化
printf("Creat List:\n");
CreatList(&s);//建立顺序表
print(s);//输出顺序表
scanf("%d%d",&x,&i);//输入要插入的元素x值和位置i
Insert_SeqList(s,i,x);//将元素x插入到顺序表中
print(s);//输出插入元素x后的顺序表
scanf("%d",&i);//输出要删除元素的位置i
Delete_SeqList(s,i);//删除顺序表第i个位置上的元素
print(s);
scanf("%d",&x);//输入要查找的元素x值
i=Location_SeqList(s,x);//定位要查找的元素x在顺序表中的位置
printf("element %d site is %d\n",x,i);
}