uva 133 - The Dole Queue

首次使用环状的链表,可见数据结构没必要过于拘泥形式,只要能对于问题能抽象出相应的结构问题即可迎刃而解。



#include<stdio.h>

#include<stdlib.h>

typedef struct _person

{

	int num;

	struct _person *next;

	struct _person *last;

}person;

person * creat(int n)

{

	int i;

	person *head,*p,*now;

	now=(person *)malloc(sizeof(person));

	head=now;

	p=now;

	head->num=1;

	for(i=2;i<=n;i++)

	{

		now=(person *)malloc(sizeof(person));

		now->num=i;

		p->next=now;

		now->last=p;

		p=now;

	}

	p->next=head;

	head->last=p;

	return head;

}





int main()

{

	person *head,*p,*pp,*pm,*pk;

	int i,n,k,m,flag;

	while(scanf("%d%d%d",&n,&k,&m)!=EOF&&n&&k&&m)

	{

		head=creat(n);

		pk=head;

		pm=head->last;

		while(head!=NULL)

		{

			flag=0;

			for(i=1;i<k;i++)

				pk=pk->next;

			for(i=1;i<m;i++)

				pm=pm->last;

			if(pk->num==pm->num)

			{

				printf("%3d",pk->num);

				p=pk;

				pk=pk->next;

				pm=pm->last;

				pk->last=pm;

				pm->next=pk;

				if(p->num==head->num)

				{

					if(p->num==pk->num)

					    head=NULL;

					else

						head=head->next;

				}

				free(p);

				flag=1;

			}

			else

			{

				printf("%3d%3d",pk->num,pm->num);

				p=pk;

				pp=pk->last;

				pk=pk->next;

				pp->next=pk;

				pk->last=pp;

				if(p->num==head->num)

					head=head->next;

				free(p);

				p=pm;

				pp=pm->next;

				pm=pm->last;

				pm->next=pp;

				pp->last=pm;

				if(pk->num==p->num)

					pk=pk->next;

				if(p->num==head->num)

				{

					if(pm->num==p->num)

						head=NULL;

					else

						head=head->next;

				}

				free(p);

				flag=1;

			}

			if(flag&&head!=NULL)

				printf(",");

		}

		printf("\n");

	}

	return 0;

}

你可能感兴趣的:(Queue)