线性表的数组实现基本操作详解
1. 建立空表
2. 查找元素
3. 插入元素
4. 删除元素
结构体
typedef struct LNode *List;
struct LNode{
ElementType Data [MAXSIZE];
int Last;//线性表最后一个元素位置
};
struct LNode L;
List Ptrl;
访问下标为i的元素:L.Data[i]或Ptrl->Data[i]
线性表的长度 L.Last+1或Ptrl->Last+1;位置从0开始,所以长度取last+1;
1.建立空表
List MakeEmpty()
{
List Ptrl;//结构的指针
Ptrl = (List )malloc(sizeof(struct LNode));
Ptrl->Last=-1;//空表的最后一个元素下标为-1,如果此表中含有一个元素,则last为0,代表这个数组的最后一个元素下标为0
return Ptrl;
}
2.查找
查找平均次数(n+1)/2,时间性能O(n)
int Find(ElementType X,List Ptrl)//线性表结构指针
{
int i=0;
while(i<=Ptrl->Last&&Ptrl->Data[i]!=X)//如果data[i]不为X,并且数组中还有元素未比较
i++;
if(i>Ptrl->Last)//两种情况:遍历了数组还没有找到
return -1;
else//已经找到了
return i; //返回的是所找元素的数组下标
}
3.插入
时间复杂度O(n)
insert(ElementType X,List Ptrl,int i)//i是数组第i个数字,对应的下标是i-
{
int j;
if(Ptrl->Last==MAXSIZE-1 )//最后一个元素下标是MaxSize-1
printf("表满");
if(i<1||i>Ptrl->Last+2)//小于第一个位置(头插)大于最后一个位置+1(尾插)
Ptrl->Data[j+1]=Ptrl->Data[j];//为了空出第i个位置,要把原来从i位置到最后一个位置的数字倒序向后挪
Ptrl->Data[i-1]=X;
Prtl->Last++;//最后一个元素下标+1
return ;
}
4,删除
时间复杂度O(n);
delete(ElementType X,List Ptrl,int i)//i对应的是删除元素的位置,则删除元素对应下标为i-1
if (i<1||i>Ptrl->Last+1)//当删除位置i小于第一个位置或大于最后一个位置(数组的长度last+1),不合法
printf("位置错误");
else
{
int j;
for(j=i;j<=Ptrl->Last;j++)
Ptrl->Data[j-1]=Ptrl->Data[j];
Ptrl->Last--;
return ;
}
完整代码
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
#define ElementType int
typedef struct LNode *List;
struct LNode{
ElementType Data [MAXSIZE];
int Last;//线性表最后一个元素
};
struct LNode L;
List Ptrl;
List MakeEmpty()
{
List Ptrl;//结构的指针
Ptrl = (List )malloc(sizeof(struct LNode));
Ptrl->Last=-1;//空表的最后一个元素下标为-1,如果此表中含有一个元素,则last为0,代表这个数组的最后一个元素下标为0
return Ptrl;
}
int Find(ElementType X,List Ptrl)//线性表结构指针
{
int i=0;
while(i<=Ptrl->Last&&Ptrl->Data[i]!=X)//如果data[i]不为X,并且数组中还有元素未比较
i++;
if(i>Ptrl->Last)//两种情况:遍历了数组还没有找到
return -1;
else//已经找到了
return i; //返回的是所找元素的数组下标
}
insert(ElementType X,List Ptrl,int i)//i是数组第i个数字,对应的下标是i-
{
int j;
if(Ptrl->Last==MAXSIZE-1 )//最后一个元素下标是MaxSize-1
printf("表满");
if(i<1||i>Ptrl->Last+2)//小于第一个位置(头插)大于最后一个位置+1(尾插)
Ptrl->Data[j+1]=Ptrl->Data[j];//为了空出第i个位置,要把原来从i位置到最后一个位置的数字倒序向后挪
Ptrl->Data[i-1]=X;
Prtl->Last++;//最后一个元素下标+1
return ;
}
delete(ElementType X,List Ptrl,int i)//i对应的是删除元素的位置,则删除元素对应下标为i-1
if (i<1||i>Ptrl->Last+1)//当删除位置i小于第一个位置或大于最后一个位置(数组的长度last+1),不合法
printf("位置错误");
else
{
int j;
for(j=i;j<=Ptrl->Last;j++)
Ptrl->Data[j-1]=Ptrl->Data[j];
Ptrl->Last--;
return ;
}