求一个c的单链表程序

再完整一点
2025-02-02 08:41:17
推荐回答(1个)
回答1:

-----------线性表的单链表存储结构-------------

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;

}