2021-02-05

单链表的三个例子

/*
有一个带头结点的单链表L=(a1,b1,a2,b2.......an,bn),
设计一个算法将L拆成两个带头结点的单链表L1,L2,分别
使用头插法和尾插发
*/



void split(LinkNode*& L, LinkNode*& L1, LinkNode*& L2)
{
	LinkNode* p = L->next, * q, * r1;     //p指向第一个数据节点
	L1 = L;                               //L1利用原来L的头结点
	r1 = L1;                              //r1始终指向L1尾结点
	L2 = (LinkNode*)malloc(sizeof(LinkNode));//创建L2头结点
	L2->next = NULL;                         //置L2指针域为NULL
	while (p != NULL)						 
	{
		r1->next = p;                        //采用尾插法将p插入L1中
		r1 = p;                              
		p = p->next;                         //p移动到下一个节点
		q = p->next;                         //用q保存p的后继节点
		p->next = L2->next;                  //采用头插法将节点p插入L2中
		L2->next = p;
		p = q;                               //p重新指向ai+1节点
	}
	r1->next = NULL;                         //尾结点NEXT置空
}



/*
设计一个算法,删除一个单链表L中元素值最大的结点
*/
void delmaxnode(LinkNode*& L)
{
	LinkNode* p = L->next, * pre = L, * maxp = p, * maxpre = pre; 
	while (p != NULL)
	{
		if (maxp->date < p->date)
		{
			maxp = p;
			maxpre = pre;
		}
		pre = p;
		p = p->next;
	}
	maxpre->next = maxp->next;
	free(maxp);
	
}


/*
有一个带头结点的单链表L,设计一个算法使其元素有序递增
*/
void sort(LinkNode*& L)
{
	LinkNode* p, * pre, * q;
	p = L->next->next;//p指向L第二个数据结点
	L->next->next = NULL;
	while (p!=NULL)
	{
		q = p->next;
		pre = L;
		while (pre->next!=NULL)
			pre = pre->next;

			p->next = pre->next;
			pre->next = p;
			p = q;
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.头发掉不完.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值