数据结构笔记二(20120825)

数据结构笔记二(20120825)
程序说明:
1.c:利用单向环表进行操作,一圈人进行正序报数,报到K退出;看谁是最后一个人;
2.c:利用双向环表进行操作,一圈人进行逆序报数,报到K退出;看谁是最后一个人
3.c:利用双向环表进行操作,一圈人进行正序和逆序同时报数,先正序,再到序,报到K的退出;看谁是最后一个人;

1.  1.c:

 

/*
 *wuxiuwen
 *利用单向环表进行操作,一圈人进行正序报数,报到K退出;看谁是最后一个人;
 *20120825
 */
#include<stdio.h>
#include<stdlib.h>
//单链表的环表
typedef struct Node
{
	int data;
	struct Node *next;
}NODE;

void Creatlist(NODE **);
NODE *getnode(int );
NODE *play(NODE *);

int main()
{
	NODE *head = NULL;

	Creatlist(&head);

	head = play(head);
	printf("最后留下的人为:%d\n",head->data);
	return 0;    
}
void Creatlist(NODE **phead)
{
	int n;  //人数
	//int k; //第K个退出
	NODE *pnew = NULL;
	NODE *pend = NULL;
	int i ;  //当前的人

	printf("清输入参与的人数:\n");
	scanf("%d",&n);
	for(i = 1;i<=n;i++)
	{
		pnew = getnode(i);
		if(pnew ==NULL)   //申请的空间没有申请到,重新申请
		{
			i--;
			printf("申请的空间没有申请到,重新申请.\n");
			continue;
		}
		if(*phead == NULL)
			*phead = pend = pnew;
		else 
		{	
		    	pend->next= pnew;
			pend = pnew;
		}
		  
	}
	pend->next = *phead;

}
NODE *getnode(int num)
{
	NODE *p =NULL;
	p = (NODE * )malloc(sizeof(NODE));
	if(p == NULL)
	    return NULL;
	p->data= num;
	p->next=NULL;
	return p;
}
/*
 *有n个人进行围成一个圈,报数,如果报数报到k这个数字,则退出,
 *一直不停的进行报数,直到最后一个人,输出这个人。
 *
 */
NODE *play (NODE *head)
{
	int k; //逢k退出
	NODE *p = head;

	while(p->next !=head)
	{
		p = p->next;
	}
	printf("请输入第几个退出:\n");
	scanf("%d",&k);
	int i = 1;  //负责报数

	while(head->next != head)
	{
		if(i == k)
		{
			p->next=head->next;
			free(head);
			head=p->next;
			i=1;			
		}
		else
		{
			p= head;
			head = head->next;
			i++;
		}
	}
	return head;

} 

 

执行结果:

[root@localhost Desktop]# gcc 1.c
[root@localhost Desktop]# ./a.out
清输入参与的人数:
10
请输入第几个退出:
2
最后留下的人为:5
[root@localhost Desktop]#

 

 

 

2.  2.c: 

/*
 *wuxiuwen
 *2.c:利用双向环表进行操作,一圈人进行逆序报数,报到K退出;看谁是最后一个人
 *20120825
 *
 */
#include<stdio.h>
#include<stdlib.h>
//双向链表的环表
typedef struct Node
{
	int data;
	struct Node *next;
	struct Node *back;
}NODE;

void Creatlist(NODE **);
NODE *getnode(int );
NODE *play(NODE *);

int main()
{
	NODE *head = NULL;

	Creatlist(&head);

	head = play(head);
	printf("最后留下的人为:%d\n",head->data);
	return 0;    
}
void Creatlist(NODE **phead)
{
	int n;  //人数
	//int k; //第K个退出
	NODE *pnew = NULL;
	NODE *pend = NULL;
	int i ;  //当前的人

	printf("清输入参与的人数:\n");
	scanf("%d",&n);
	for(i = 1;i<=n;i++)
	{
		pnew = getnode(i);
		if(pnew ==NULL)   //申请的空间没有申请到,重新申请
		{
			i--;
			printf("申请的空间没有申请到,重新申请.\n");
			continue;
		}
		if(*phead == NULL)
			*phead = pend = pnew;
		else 
		{	
		    	pend->next= pnew;
			pnew->back=pend;
			pend = pnew;
		}
		  
	}
	pend->next = *phead;
	(*phead)->back=pend;

}
NODE *getnode(int num)
{
	NODE *p =NULL;
	p = (NODE * )malloc(sizeof(NODE));
	if(p == NULL)
	    return NULL;
	p->data= num;
	p->next=NULL;
	p->back=NULL;
	return p;
}
/*
 *有n个人进行围成一个圈,报数,如果报数报到k这个数字,则退出,
 *一直不停的进行报数,直到最后一个人,输出这个人。
 *这个是用双向环表进行操作,逆序进行报数,规则同上。
 */
NODE *play (NODE *head)
{
	int k; //逢k退出
	NODE *p = head;

	printf("请输入第几个退出:\n");
	scanf("%d",&k);
	int i = 1;  //负责报数

	while(head->next != head)
	{
		if(i == k)
		{
			p =head->next;
			head->back->next=head->next;
			head->next->back=head->back;
			free(head);
			head=p;
			i=1;			
		}
		else
		{
			head = head->back;
			i++;
		}
	}
	return head;

}


执行结果: [root@localhost Desktop]# gcc 2.c
[root@localhost Desktop]# ./a.out
清输入参与的人数:
20
请输入第几个退出:
3
最后留下的人为:12
[root@localhost Desktop]# 
 

 

3.  3.c


/*
 * wuxiuwen
 * 利用双向环表进行操作,一圈人进行正序和逆序同时报数,先正序,在到序,
 * 报到K的退出;看谁是最后一个人
 * 20120825
 */
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
	int data;
	struct Node *next;
	struct Node *back;
}NODE;

void Creatlist(NODE **);
NODE *getnode(int );
NODE *play(NODE *);

int main()
{
	NODE *head = NULL;

	Creatlist(&head);

	head = play(head);
	printf("最后留下的人为:%d\n",head->data);
	return 0;    
}
void Creatlist(NODE **phead)
{
	int n;  //人数
	//int k; //第K个退出
	NODE *pnew = NULL;
	NODE *pend = NULL;
	int i ;  //当前的人

	printf("清输入参与的人数:\n");
	scanf("%d",&n);
	for(i = 1;i<=n;i++)
	{
		pnew = getnode(i);
		if(pnew ==NULL)   //申请的空间没有申请到,重新申请
		{
			i--;
			printf("申请的空间没有申请到,重新申请.\n");
			continue;
		}
		if(*phead == NULL)
			*phead = pend = pnew;
		else 
		{	
		    	pend->next= pnew;
			pnew->back=pend;
			pend = pnew;
		}
		  
	}
	pend->next = *phead;
	(*phead)->back=pend;

}
NODE *getnode(int num)
{
	NODE *p =NULL;
	p = (NODE * )malloc(sizeof(NODE));
	if(p == NULL)
	    return NULL;
	p->data= num;
	p->next=NULL;
	p->back=NULL;
	return p;
}
/*
 *有n个人进行围成一个圈,报数,如果报数报到k这个数字,则退出,
 *一直不停的进行报数,直到最后一个人,输出这个人。
 *这个是用双向环表进行操作,逆序进行报数,规则同上。
 */
NODE *play (NODE *head)
{
	int k; //逢k退出
//	NODE *p = head;
	int flag=0;  //为0的时候进行正序报数,为1的时候进行逆序报数
	printf("请输入第几个退出:\n");
	scanf("%d",&k);
	int i = 1;  //负责报数

	while(head->next != head)
	{
		if(i == k)
		{     
				head->back->next=head->next;
				head->next->back=head->back;
				free(head);
				head=flag?head->back:head->next;
				flag = ~(flag);
				i=1;
		}
		else
		{
			if(flag ==1)
			{
				head = head->back;
			}	
			if(flag == 0)
			{
			    	head = head->next;
			}
			i++;
		}
	}
	return head;

}


 

执行结果:

[root@localhost Desktop]# gcc 3.c
[root@localhost Desktop]# ./a.out
清输入参与的人数:
10
请输入第几个退出:
1
最后留下的人为:6
[root@localhost Desktop]#

***********************************************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值