经典例题9

本文介绍了C语言中关于链表的一些经典操作,包括从尾到头反向输出链表节点值、删除单链表中的最小值节点、就地逆置链表的两种方法以及如何对链表进行排序。提供了详细的算法实现,并解释了每个操作的逻辑步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设L为带头结点的单链表, 编写算法实现从尾到头反向输出每个结点的值
void Print(LinkList L)
{
if(L->next!=NULL)
{
Print(L->next);
}
printf("%d ",L->data);
}

试编写在带头结点的单链表L中删除一个最小值结点的高效算法(假设最小值结点是唯一的).
LinkList Delete(LinkList &L)
{
LNode *pre=L,p=L->next,*r;
LNode *minpre=pre,*minp=L->next;//保存最小值和他的前驱
while(p!=NULL)
{
if(p->data < minp->data) //第一次不成立
{
minp=p;
minpre=pre;
}
pre=p; //扫描下一个结点
p=p->next;
}
minpre->next=minp->next; //删除最小值的结点
free(minp);
return L;
}

试编写算法将带头结点的单链表就地逆置(所谓“就地” 是指辅助空间复杂度为O(1))
方法1
LinkList Reserve(LinkList &L)
{
LNode *p=L,*r=L->next;
L->next=NULL;
while(r!=NULL)
{
r=r->next;
p=p->next;
p->next=L;
L=p;
}
}
方法2
LinkList Reserve(LinkList L)
{
LNode *pre,*p=L->next,*r=p->next;//r是防止丢掉p后的链,
p->next=NULL;//先不处理头结点
while(r!=NULL)
{
pre=p;
p=r;
r=r->next;
p->next=pre; //指针翻转
}
L->next=p; //将头结点接上
return L;
}

有一个带头结点的单链表L,设计一个算法使其元素递增有序。(这个没怎么懂)
void Sort(LinkList &L)
{
LNode *p=L->next,pre;
LNode *r=p->next;
p->next = NULL;
p=r;
while(p!=NULL)
{
r=p->next;
pre=L;
while(pre->next != NULL && pre->next->data < P->data)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=r;
}
}

设在一个带表头结点的单链表中 所有元素结点的数据值无序,试编写一个函数
删除表中所有介于给定的两个值(作为函数参数给出)之间的元素的元素(若存在).

LinkList Delete(LinkList L,ElemType x,ElemType y)
{
LNode *pre=L,*p=L->next;
while (p!=NULL)
{
if(p->data > x && p->data < y)
{
pre->next=p->next;
free§;
}
else
{
pre=p;
p=p->next;
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值