线性表的顺序存储实现
//线性表用数组来实现
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef;//系数
int expon;//exponential指数
Polynomial link;
};
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
//1.初始化(建立空的顺序表)
List MakeEmpty()
{
List PtrL;
PtrL=(List)malloc(sizeof(struct LNode));//产生头结点,并使L指向头结点
PtrL->Last=-1;//=0表示第一个元素,=-1表示无元素
return PtrL;//返回结构指针
}
//2.查找
int Find(ElementType X,List PtrL)//List PtrL线性表结构的指针/在线性表中找到X所在的位置
{
int i=0;
while(i<=PtrL->Last&&PtrL->Data[i]!=X)
i++;
if(i>PtrL->Last)
return -1;//如果没找到,返回-1
else
return i;//找到后返回存储位置
}
//查找成功的平均比较次数为(n+1)/2,平均时间性能为O(n)
//3.插入操作实现
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];//将ai~an倒序向后移动
PtrL->Data[i-1]=X;//新元素插入
PtrL->Last++;//Last仍指向最后元素
return;
}
//平均移动次数为n/2,平均时间性能为O(n)
//4.删除操作实现
void Delete(int i,List PtrL)
{
int j;
if(i<1||i>PtrL->Last+1){//检查空表及删除位置的合法性
printf("不存在第%d个元素",i);
return;
}
for(j=i;j<=PtrL->Last;j++)
PtrL->Data[i-1]=PtrL->Data[i];//将ai+1~an顺序向前移动
PtrL->Last--;//Last仍指向最后元素
return;
}
//平均移动次数为n/2,平均时间性能为O(n)
//链表
typedef struct LNode *List ;
struct LNode{
ElementType Data;
List Next;
};
struct Lnode L;
List PtrL;
//1.求表长——链表遍历
int Length(List PtrL)//链表头指针
{
List p=PtrL;//p指向表的第一个结点
int j=0;
while(p){
p=p->Next;//最后一个结点是NULL
j++;//当前p指向的是第j个结点
}
return j;
}
//时间性能为表长O(n)
//2.查找
//(1)按序号查找:FindKth;
List FindKth(int K,List PtrL)
{
List p=PtrL;//p指向表头
int i=1;
while(p!=NULL&&i<K){
p=p->Next;
i++;
}
if(i==K)
return p;//找到第K个,返回指针
else
return NULL;//否则返回空
}
//(2)按值查找
List Find(ElementType X,List PtrL)
{
List p=PtrL;
while(p!=NULL&&p->Data!=X)//p->Data!=X没找到
p=p->Next;
return p;
}
//3.插入
List Insert(ElementType X,int i,List PtrL)//将X插入到PtrL的第i个位置
{
List p,s;
if(i==1){//新结点插入在表头 i-1=0,在链表中是不存在的,所以要做特殊处理
s=(List)malloc(sizeof(struct LNode));//申请填装结点
s->Data=X;
s->Next=PtrL;
return s;//返回新表头指针
}
p=FindKth(i-1,PtrL);//查找第i-1个结点
if(p==NULL){//第i-1个结点不存在,不能插入
printf("参数i错误");
return NULL;
}
else{
s=(List)malloc(sizeof(struct LNode));//申请填装结点
s->Data=X;
s->Next=p->Next;//新结点插入在第i-1个结点的后面
p->Next=s;
return PtrL;
}
}
//4.删除
List Delete(int i,List PtrL)
{
List p,s;
if(i==1){//若要删除的是表的第一个结点
s=PtrL;//s指向第一个结点
if(PtrL!=NULL)//从链表中删除
PtrL=PtrL->Next;
else
return NULL;//第一种情况是PtrL本身就是空白,这是删除不成功
free(s);//释放被删除结点
return PtrL;
}
p=FindKth(i-1,PtrL);//查找第i-1个结点
if(p==NULL){
printf("第%d个结点不存在",i-1);
return NULL;
}
else if(p->Next==NULL){
printf("第%d个结点不存在",i);
return NULL;
}
else{
s=p->Next;//s指向第i个结点
p->Next=s->Next;//从链表中删除
free(s);//释放被删除结点
return PtrL;
}
}

本文介绍了线性表的两种主要存储方式:顺序存储与链式存储。详细讲述了每种存储方式下的基本操作,如初始化、查找、插入和删除等,并提供了具体的实现代码。
454

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



