单链表程序

单链表程序,第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

}

如果还没解决你的问题,可以加我百度HI账号。

判断k<i

这个可以放在前面,也是用来判断输入参数是否正确,链表开始应该是1,如仔察果i<1那就不对了。

因为删凯戚丛除节点是一盯樱个一个删除的,而c语言里面删除是用free。当删除的时候。指向下一个节点的指针也没了。

所以用u指向当前要删除的节点,p指向下一个节点。

然后释放当前节点。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12338079.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存