单链表习题整理(二)

题目

已知指针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);
		}
	}
}
		
发布了73 篇原创文章 · 获赞 20 · 访问量 4483

猜你喜欢

转载自blog.csdn.net/lzl980111/article/details/102921967