**
顺序表操作集
List MakeEmpty(); //空表
Position Find( List L, ElementType X );//在表中查找X
bool Insert( List L, ElementType X, Position P );//在位置P插入元素X
bool Delete( List L, Position P );//删除位置P的元素
List MakeEmpty()
{
List L;
**/*因为List为指针,所以得先分配内存空间*/**
L=(List)malloc(sizeof(struct LNode));
**/*初始时Last为-1,表示无元素*/**
L->Last=-1;
return L;
}
Position Find( List L, ElementType X )
{
int i;
**/*遍历顺序表,若存在元素与X相当,则返回下标i*/**
for(i=0;i<=L->Last;i++)
if(L->Data[i]==X)
return i;
return ERROR;
}
bool Insert( List L, ElementType X, Position P )
{
int i;
**/*表的最大容量为MAXSIZE,但初始下标为0,所以最大下标为MAXSIZE-1*/**
if(L->Last==MAXSIZE-1)
{
printf("FULL");
return false;
}
/
*0为第一个元素下标,L->Last为最后元素下标
插入时可以从头插入,即插入下标为0
也可以从尾部插入,初始尾部为L->Last,即插入下标为L->Last+1
所以插入的范围应该在0<——>L->Last+1
*/
else if(P<0||P>L->Last+1)
{
printf("ILLEGAL POSITION");
return false;
}
for(i=L->Last;i>=P;i--)
L->Data[i+1]=L->Data[i];
L->Data[P]=X;
/*插入时,Last++*/
L->Last++;
return true;
}
bool Delete( List L, Position P )
{
int i;
/*
删除时的下标和插入有所不同
第一个元素下标为0
最后一个下标为L->Last
所以下标范围为0<——>L->Last
*/
if(P<0||P>L->Last)
{
printf("POSITION %d EMPTY",P);
return false;
}
else
{
for(i=P;i<L->Last;i++)
L->Data[i]=L->Data[i+1];
/*删除时,Last--*/
L->Last--;
return true;
}
}
链式表操作集
/*P不是元素的第几个位置,P是链式表中的结点*/
Position Find( List L, ElementType X );//查找元素X
List Insert( List L, ElementType X, Position P );//在结点P前,插入元素X
List Delete( List L, Position P );//删除结点P
Position Find( List L, ElementType X )
{ /*这里要将p指向L,否则如果直接操作L,会改变L的指向*/
List p=L;
while(p)
{
if(p->Data==X)
return p;
else
p=p->Next;
}
return ERROR;
}
List Insert( List L, ElementType X, Position P )
{
List q=L,temp;//q指向头结点
/*插入位置为头结点时*/
if(P==L)
{
temp=(List)malloc(sizeof(struct LNode));
temp->Data=X;
//插入结点的指针指向q
temp->Next=q;
//头结点指向插入结点
L=temp;
return L;
}
/*插入结点非头结点时*/
else
{
while(q)
{ /*找结点P的直接前驱q*/
if(q->Next==P)
{
temp=(List)malloc(sizeof(struct LNode));
temp->Data=X;
temp->Next=q->Next;
q->Next=temp;
return L;
}
q=q->Next;
}
printf("Wrong Position for Insertion\n");
return ERROR;
}
}
List Delete( List L, Position P )
{ /*q指向头结点*/
List q=L,temp;
/*删除结点为头结点时,表头指向头结点的后继节点*/
if(P==L)
{
L=L->Next;
return L;
}
else
{
while(q->Next)
{ //找结点P的直接前驱q
if(q->Next==P)
{
temp=q->Next;
q->Next=temp->Next;
free(temp);
return L;
}
q=q->Next;
}
printf("Wrong Position for Deletion\n");
return ERROR;
}
}