单链表习题整理(二)

题目

已知指针la和lb分别指向两个无头结点单链表中的首元结点。下列算法是从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中的第j个元素之前。

思路

在la中查找第i个结点,用p标记当前结点,有prep标记当前结点的前一个结点;删除这前p个结点,即将prep的next指向其他结点;又插入到表第j个元素之前,即指向lb中第j个元素,lb指向p,注意是无头结点的单链表,因此第一个结点处不同。

代码段

Status T216(LinkList *la,LinkList *lb,int i,int j,int len)
{
 	LinkList p,q,s,prep;
 	int k;
 	if(i<0||j<0||len<0)
 		return INFEASIBLE;//当i,j,len有一个小于0返回错误
 	p=*la;
 	k=1;
 	prep=NULL;
 	while(p&&k<i)
 	{
 		prep=p;
 		p=p->next;
 		k++;
 	}									//在la中查找第i个结点,用p标记,prep指向p的前一个结点
 	if(!p)								//p为空则返回错误
 		return INFEASIBLE;				//找不到第i个元素则返回错误
 	q=p;								//p指向la中第i个结点
 	while(q&&k<i+len-1)
 	{
 		q=q->next;
 		k++;
 	}									//查找la中第i+len-1个结点,用q标记
 	if(!q)
 		return INFEASIBLE;
 	if(!prep)							//i=1的情况,prep等于空时
 		*la=q->next;
 	else								//完成删除
 		prep->next=q->next;

 	if(j==1)							
 	{
 		q->next=*lb;					//j=1时同无头结点的插入,个人理解
 		*lb=p;
 	}
 	else
 	{
 		s=*lb;
 		k=1;
 		while(s&&k<j-1)					//查找lb中第j-1个元素
 		{
 			s=s->next;					//当j不等于1的时候,找到j的前一个结点,赋给s,然后q插入到lb
 			k++;
 		}
 		if!s)
 			return INFEASIBLE;
 		q->next=s->next;
 		s->next=p;			//完成插入
 		return OK;
 	}
 }
 		
 	
 		

题目二

设计在无头结点的单链表中删除第i个结点

思想

先判断i位置的合法性,当i<0或i>n-1时,不允许进行删除操作

代码

void delete(LinkList *q,int i)
{
	LinkList *p,*s;
	int j;
	if(i<0)
		printf("ERROR");
	else if(i==0)
	{
		s=q;
		q=q->next;
		free(s);
	}
	else
	{
		j=0;
		s=q;
		while((j<i)&&(s!=NULL))
		{
			p=s;
			s=s->next;
			j++;
		}
		if(s==NULL)
			printf("ERROR");
		else
		{
			p->next=s->next;
			free(s);
		}
	}
}
		
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值