数据结构笔记二(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]#
***********************************************************************