单链表的应用实例

1、有一个带头结点的单链表L=(a1,b1,a2,b2,a3,b3…an,bn),设计一个算法将其拆分为两个带头结点的单链表L1和L2,其中L1=(a1,a2,a3,a4…an),L2=(bn,…b3,b2,b1),要求L1使用L的头节点。

解:利用原单链表L中的所有结点通过改变指针域重组成两个单链表L1和L2。由于L1中结点的相对顺序与L中的相同,所以采用尾插法建立单链表L1;由于L2中结点的相对顺序与L中的相反,所以采用头插法建立单链表L2。代码如下:

void split(LinkNode * &L,LinkNode * &L1,LinkNode * &L2)
{
	LinkNode *p=L->next,*q,*rl;    //p指向第一个数据结点
	L1=L;
	rl=L1;           //rl始终指向L1的尾结点
	L2=(LinkNode *)malloc(sizeof(LinkNode));    //创建L2的头结点
	L2->next=NULL;
	while(p!=NULL)
	{
		rl->next=p;      //采用尾插法将p插入到L1中
		rl=p;
		p=p->next;
		q=p->next;
		p->next=L2->next;		//采用头插法将结点p插入L2中
		L2->next=p;
		p=q;      //重定位
	}
	rl->next=NULL;
}

2、设计一个算法,删除一个单链表L中元素值最大的结点(假设这样的结点唯一)。

解:在单链表中删除一个结点先要找到它的前驱结点,用指针p扫描整个单链表,pre指向结点p的前驱结点,再扫描时用maxp指向data域值最大的结点,maxpre指向maxp所指结点的前驱结点。当单链表扫描完毕后,通过maxpre所指的结点删除其后的结点,即删除了结点值最大的结点。算法如下:

void delmaxnode(LinkNode * &L)
{	
	LinkNode *p=L->next,*pre=L,*maxp=p,*maxpre=pre;
	while(p!=NULL)
	{
		if(maxp->data<p->data)
		{
			maxp=p;
			maxpre=pre;
		}
		pre=p;
		p=p->next;
	}
	maxpre->next=maxp->next;
	free(maxp);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值