有头结点链表的操作
//创建并返回一个空的线性表
List MakeEmpty()
{
List L;
L=(List)malloc(sizeof(List));
L->Next=NULL;
return L;
}
//返回线性表中X的位置。若找不到则返回ERROR
Position Find( List L, ElementType X )
{
L=L->Next;
while(L!=NULL)
{
if(L->Data==X)
return L;
L=L->Next;
}
return ERROR;
}
//将X插入在位置P指向的结点之前,返回true。如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回false
bool Insert( List L, ElementType X, Position P )
{
List q;
q=(List)malloc(sizeof(List));
while(L!=NULL)
{
if(L->Next==P)
{
q->Data=X;
q->Next=P;
L->Next=q;
return true;
}
L=L->Next;
}
printf("Wrong Position for Insertion\n");
return false;
}
//将位置P的元素删除并返回true。若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回false
bool Delete( List L, Position P )
{
while(L!=NULL)
{
if(L->Next==P)
{
L->Next=P->Next;
free(P);
return true;
}
L=L->Next;
}
printf("Wrong Position for Deletion\n");
return false;
}
无头结点链表的操作
Position Find( List L, ElementType X )
{
while(L!=NULL)
{
if(L->Data==X)
return L;
L=L->Next;
}
return ERROR;
}
bool Insert( List L, ElementType X, Position P )
{
List q;
q=(List)malloc(sizeof(List));
if(L==P)
{
q->Next=L;
return true;
}
while(L)
{
if(P==L->Next)
{
q->Data=X;
q->Next=L->Next;
L->Next=q;
return true;
}
L=L->Next;
}
printf("Wrong Position for Insertion\n");
return false;
}
bool Delete( List L, Position P )
{
if(L==P)
{
L=L->Next;
free(P);
return true;
}
while(L)
{
if(L->Next==P)
{
L->Next=P->Next;
free(P);
return true;
}
L=L->Next;
}
printf("Wrong Position for Deletion\n");
return false;
}
从上述代码我们可以看到,有头结点的链表在操作是不需要对头结点进行单独考虑,在写代码时更加方便直观。