|
|
#2
loveshuang2011-03-26 02:56
稍作修改希望可以帮到你。
指针在传递时没有分配空间的话最好用引用传递防止在函数中改变它的地址,没有初始化的指针千万不能赋值,切记切记!!! #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef int Elemtype; typedef struct Cnode { Elemtype data; struct Cnode *next; }* Link,CNode; Status Creat_clist(Link& clist,int n) { CNode *p,*q; int i; clist=(Link)malloc(sizeof(CNode)); clist->data=1; clist->next=NULL; for(i=n;i>1;i--) { p=(Link)malloc(sizeof(CNode)); if(!p) exit(OVERFLOW); //内存分配失败 p->data=i; p->next=clist->next; clist->next=p; if(i==n) q=p; //用q指向链表最后一个节点 } q->next=clist; //构成循环链表 // return clist; //clist即为指向第一个节点的指针 return OK; } Status Kingmonkey(Link& clist) { CNode *p,*q; p=clist; int m,i; m=13; do { for(i=1;i<13;i++) { int n=m; while(n-->2) p=p->next; q=p->next; if(q==clist) clist=q->next; p->next=q->next; p=p->next; printf("输出要删除的节点:%d \n",q->data); free(q); m--; if(m==1) { m=13; break; } if(p->next==p) break; } }while(p->next!=p); printf("猴王是:%d\n",p->data); return OK; } void main() { int qua; printf("输入猴群的数量:\n"); scanf("%d",&qua); Link monkey; //monkey=NULL; Creat_clist(monkey,qua); //建立猴群的循环链表 Kingmonkey(monkey); } |
某森林中有n只猴子商量选猴王问题,所有猴子围坐在一圈,先从第一只猴子开始报数,报道13的猴子出列,紧接着下一个猴子进行新的一轮报数,报道12的猴子出列;依次重复下去,每一轮报数都比上一轮少1,直到报到数减为一之后,又从13开始报数,直到剩下一只猴子为止,这个猴子就是猴王。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int Elemtype;
typedef struct Cnode
{
Elemtype data;
struct Cnode *next;
}CNode;
struct Cnode* Creat_clist(CNode*clist,int n)
{
CNode *p,*q;
int i;
clist=NULL;
for(i=n;i>=1;i--)
{
p=(CNode*)malloc(sizeof(CNode));
if(!p) exit(OVERFLOW); //内存分配失败
p->data=i;
p->next=clist;
clist=p;
if(i==n)
q=p; //用q指向链表最后一个节点
}
q->next=clist; //构成循环链表
return clist; //clist即为指向第一个节点的指针
}
Status Kingmonkey(CNode*clist)
{
CNode *p,*q,*l;
p=clist;
int m,i;m=13;
do
{
for(i=1;i<m-1;i++)
{ p=p->next; }
q=p->next; //q节点为要删除的节点
p->next=q->next;
p=p->next;
printf("输出要删除的节点:%d \n",q->data);
free(q);
m--;
i=1;
if(m==1&&p->next!=p)
{
l=p;
p->next=l->next;
p=p->next;
printf("输出要删除的xxxxx节点:%d",l->data);
free(l);
m=13;
}
}while(p!=p->next);
printf("猴王是:%d",p->data);
return OK;
}
void main()
{
int qua;
printf("输入猴群的数量:\n");
scanf("%d",&qua);
CNode *monkey;
monkey=NULL;
monkey=Creat_clist(monkey,qua); //建立猴群的循环链表
Kingmonkey(monkey);
}
谢谢啦