数据结构线性表习题(一)

已知三个带头结点的线性链表A,B,C中的结点均依元素值从小向大递减排列,编写算法对A表进行如下操作:使操作后的链表A中仅留下三个表中均包含的数据元素的结点,且没有值相同的结点,并释放所有无用的结点。算法时间复杂度为O(m+n+p),为m,n,p三表长度


设计思路:留下三个表中的公共数据,首先查找两表A、B的公共数据,然后去C中找有无该数据。


代码:

void Common(LinkList A,LinkList B,LinkList C)
{
	pa=A->next;
	pb=B->next;
	pc=C->next;
	pre=A;
	while(pa&&pb&&pc)
	{
		while(pa&&pb)
		{
			if(pa->data<pb->data)
			{
				u=pa;
				pa=pa->next;
				free(u);
			}
			else if(pa->data>pb->data)
			{
				pb=pb->next;
			}
			else if(pa&&pb)
			{
				while(pc&&pc->data<pa->data)
				{
					pc=pc->next;
				}
				if(pc)
				{
					if(pc->data>pa->data)
					{
						u=pa;
						pa=pa->next;
						free(u);
					}
					else
					{
						if(pre==A)
						{
							pre->next=pa;
							pre=pa;
							pa=pa->next;
						}
						else if(pre->data==pa->data)
						{
							u=pa;
							pa=pa->next;
							free(u);
						}
						else 
						{
							pre->next=pa;
							pre=pa;
							pa=pa->next;
						}
						pb=pb->next;
						pc=pc->next;			
					}
				}
			}
		}
	}
	if(pa==NULL)
	{
		pre->next=NULL;
	}
	else
	{
		pre->next=NULL;
		while(pa!=NULL)
		{
			u=pa;
			pa=pa->next;
			free(u);
		}
	}
	return A;	
}


你可能感兴趣的:(数据结构,c,算法,null)