线性表的操作集合
本文只含有简单的线性表的插入删除,查找等操作。
一. 线性表的顺序存储
存储结构:
typedef int Position;
typedef struct LNode *PtrTLNode; //PtrTLNode为指向LNode类型的指针;
struct LNode
{
ElementType Data[MAXSIZE];
Position Last;
};
typedef PtrTLNode List;
初始化线性表:
List MakeEmpty ()
{
List L;
L=(List) malloc(sizeof(struct LNode));
L->Last=-1;
return L;
}
顺序表的查找:
Position Find(List L,ElementType X)
{
if(!L) return -1; //如果找不到返回错误值-1;
int i=0;
while(i<=L->Last&&L->Data[i]!=X)
{
i++;
}
if(i>L->Last) return -1;
else return i; //返回找到的元素值的存储位置;
}
顺序表的插入(主要要注意,传过来的线性表是否满了,再判断要插入的位置是否合理)
bool Insert( List L, ElementType X, Position P ) //**传过来的p参数,是要插入的元素在链表中的位置;**
{
if(L->Last==MAXSIZE-1) //先判断表是否是满的
{
printf("FULL");
return false;
}
if(P>L->Last+1||P<0) //判断给的插入位置是否合理;
{
printf("ILLEGAL POSITION");
return false;
}
int i=L->Last;
for(;i>=P;i--) //把从p位置开始的参数一个一个往后挪;
{
L->Data[i+1]=L->Data[i];
}
L->Data[P]=X;
L->Last++;
return true;
}
一. 线性表的链式存储
存储结构
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
创建空表
List MakeEmpty(List L)
{
L=(List)malloc(sizeof(struct LNode));
L->Next=NULL; //带头结点;
return L;
}
链表的长度遍历
int Length(List L)
{
Position temp;
temp=L;
int num-0;
while(temp)
{
temp=temp->Next;
num++;
}
return num;
}
链表的查找(按照所给得值查找,并返回查找位置)
Position Find(List L ,ElementType X)
{
Position temp;
temp=L;
while(temp&&temp->Data!=X)
{
temp=temp->Next;
}
return temp;
}
链表的查找(按照所给的位置查找,返回查找到的值)
ElementType Find(List L ,int site) //不带头结点
{
Position temp;
temp=L;
while(site>1&&temp)
{
temp=temp->Next;
site--;
}
if(site==0&&temp) return temp->Data;
else return -1;
}
链表元素的插入(不带有头结点)
bool InsertElement(List L,ElementType X,int i)
{
Position temp;
temp=(List)malloc(sizeof(struct LNode));
temp->Data=X;
temp->Next=NULL;
if(i<1) return false;
if(i==1)
{
temp->Next=L;
return temp;
}
else {
int cnt=1;
Position pre;
pre=L;
while(pre&&cnt<i-1) //注意这里要循环i-2次;
{
pre=pre->Next;
cnt++;
}
if(pre==NULL||cnt!=i-1)
{
printf("插入位置有误\n");
free(temp);
return false;
}
else {
temp->Next=pre->Next;
pre->Next=temp;
return true;
}
}
}
链表元素的插入(带头结点)
bool InsertElement(List L,ElementType X,int i) //不用单独考虑头结点
{
Position temp;
temp=(List)malloc(sizeof(struct LNode));
int cnt=1;
Position pre;
pre=L;
while(pre&&cnt<i) //注意此处i的范围
{
pre=pre->Next;
cnt++;
}
if(cnt!=i||!pre)
{
printf("插入位置错误\n");
free(temp);
return false;
}
else {
temp->Next=pre->Next;
pre->Next=temp;
return true;
}
}
链表元素的删除
bool DeletElement(List L,int i) //带头结点,删除第i个元素;
{
Position temp,pre;
cnt=1;
pre=L;
while(cnt<i&&temp!=NULL)
{
pre->Next=pre;
cnt++;
}
if(cnt!=i||!temp)
{
printf("要删除的元素不合法\n");
return false;
}
else {
temp=pre->Next;
pre->Next=temp->Next;
free(temp);
return true;
}
}