-----------线性表的单链表存储结构-------------
typedef struct Node{
ElemType data;
struct Node *next;
} *LNode, *LinkList;
//----------线性表的单链表基本操作------------
LinkList InitList(void); //构造一个空的线性表
void DestroyList(LinkList *L);//初始条件:线性表L已存在。 操作结果:销毁线性表L。
LinkList MakeEmpty(LinkList L);//初始条件:线性表L已存在。 操作结果:将线性表L重置为空表。
int IsEmpty(LinkList L);//初始条件:线性表L已存在。 操作结果:判断线性表是否为空表。
int ListLength(LinkList L);//初始条件:线性表L已存在。 操作结果:返回线性表L结点的个数。
LNode IsLast(LinkList L); //初始条件:线性表L已存在。 操作结果:返回线性表L的最后一个结点(尾结点)。
LNode NewLNode(ElemType X);//构造一个数据域为X的新结点
LNode FindPrefious(ElemType X, LinkList L);//初始条件:线性表L已存在。 操作结果:在线性表L中寻找值为X的结点,若找到则返回该结点的前驱,否则返回NULL。
void ListDelete(LNode Pre);//初始条件:线性表L中结点P已找到。 操作结果:删除该结点。
void ListInsert(LNode Pre, LNode S);//初始条件:线性表L中结点P已找到,新结点S已构造。 操作结果:在该结点之前插入新结点X。
----------线性表的单链表基本操作的算法实现------------
//我给链表设置了一个头结点,虽然它的数据域毫无意义,但它作为一个指针却意义非凡!
//它的作用我们在下面的例程中可以领教
LinkList InitList(void) //构造一个空的线性表
{
LNode Head;
Head = (LNode)malloc(sizeof(struct Node)); //为链表的头结点分配空间
if(!Head)
{
printf("Out of space!");
return NULL;
}
Head->next = NULL;
return Head;//返回头结点
}
void DestroyList(LinkList *L)//初始条件:线性表L已存在。 操作结果:销毁线性表L。
{
LNode Head, P;
if(*L)//若线性表L已存在
{
Head = *L;
P = Head->next;
while(!P) //把链表中除头结点外的所有结点释放
{
free(Head);
Head = P;
P = Head->next;
}
free(Head); //释放头结点
}
}
LinkList MakeEmpty(LinkList L)//初始条件:线性表L已存在。 操作结果:将线性表L重置为空表。
{
LNode Head, P;
Head = *L;
P = Head->next;
while(!P)//把链表中除头结点外的所有结点释放
{
free(Head);
Head = P;
P = Head->next;
}
return (Head); //返回头结点
}
int IsEmpty(LinkList L);//初始条件:线性表L已存在。 操作结果:判断线性表是否为空表。
{
return L->next == NULL;
}
int ListLength(LinkList L)//初始条件:线性表L已存在。 操作结果:返回线性表L结点的个数。
{
LNode P = L->next;
int num = 0;
while(P) //累积线性表L结点的个数
{
num++;
P = P->next;
}
return num; //返回线性表L结点的个数
}
//初始条件:线性表L已存在。 操作结果:返回线性表L的最后一个结点(尾结点)。
LNode IsLast(LinkList L)
{
LNode P = L->next;
if(P)
{
while(P->next) //遍历线性表L
P = P->next;
}
return P; //返回线性表L的最后一个结点,若为空表则返回NULL
}
LNode NewLNode(ElemType X)//构造一个数据域为X的新结点
{
LNode S;
S = (LNode)malloc(sizeof(struct Node))//为新结点分配空间
if(!S)
{
printf("Out of space!");
return NULL;
}
S->data = X;
S->next = NULL;
return S;//返回新结点
}
//线性表L已存在。 操作结果:在线性表L中寻找值为X的结点,若找到则返回该结点的前驱,否则返回NULL。
LNode FindPrefious(ElemType X, LinkList L)
{
LNode P = L;
while(P->next && P->next->data != X)//遍历链表寻找值为X的结点
P = P->next;
if(!P->next) //如果找不到值为X的结点,返回NULL
return NULL;
else //若找到则返回该结点的前驱P
return P;
}
void ListDelete(LNode Pre)//初始条件:线性表L中结点P已找到。 操作结果:删除该结点。
{
LNode P = Pre->next;
Pre->next = P->next;
free(P);
}
//初始条件:线性表L中结点P已找到,新结点S已构造。。操作结果:在该结点之前插入新结点X。
void ListInsert(LNode Pre, LNode S)
{
S->next = Pre->next;
Pre->next = S;
}