#2
不玩虚的2013-04-23 20:37
/*看了下,编程习惯不错,这种写法真的让我大开眼界。但是你的建立循环链表就开始错了,其他的也就不说了。还有后面那个m是序号还是密码没明白,给你个例子你看下循环链表实现的约瑟夫环,c++写的,写的简单,参考下。你写写你的思路,我看下是个什么样的约瑟夫环,我帮忙改下,也学习下。*/#include <iostream>
using namespace std; typedef struct Node { int data; struct Node *next; }ListNode; void Create(ListNode *head) { ListNode *p,*q; p=head; int n; cout<<"猴子的总数n:"<<endl; cin>>n; for(int i=0;i<n;i++) {q=new Node; q->data=i+1; p->next=q; p=q; } p->next=head->next; } ListNode * find(ListNode *head,int i) { ListNode *p; p=head; int count=0; while(count<i) { p=p->next; count++; } return p; } void yuesehu(ListNode *head) { ListNode *p,*pre,*t; p=head; int m,k; cout<<"起始报数的猴子编号k:"<<endl; cin>>k; cout<<"出局数字m:"<<endl; cin>>m; p=find(p,k-1); cout<<"猴子的出队序列:"<<endl; while(p!=NULL) { for(int j=0;j<m;j++) { pre=p; p=p->next; } cout<<p->data<<" "; if(pre!=p) { t=p; pre->next=p->next; p=p->next; p=pre; delete t; } else { delete pre; p=NULL; } } } int main() { ListNode *l,*p; l=new Node; int i,c; Create(l); yuesehu(l); cout<<endl; return 0; } |
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int number;
int password;
struct node *next;
}person;
typedef person *personlist;
/* 得到一个头指针 */
void initlist(person *l)
{
person *head,*rear;
head=(person*)malloc(sizeof(person)); /* 得到一个头结点 */
rear=head; /* 让该链表为一条循环单链表 */
}
/* 初始化链表 */
void Dellist(personlist l,int e)
{
person *r,*p;
p=l->next; /* 让指针p指向头结点,从链表开始从头查找*/
while(p->next!=l->next) /* 当头结点指向自己的时候,表示删除完毕*/
{
p=p->next; /* 指针在链表上移动*/
if((p->number)==e)
{
r=p->next;
p->next=r->next;
free(r);
} /* 当指针指向的当前该结点的值时,删除该结点,并且释放结点空间*/
}
}
/* 删除链表中与e相等的值 */
int createlist(personlist l)
{
person *rear,*s;
int x,y; /* 让x和y分别赋值给结点上的号码与密码 */
int n;
n=0; /* n为输入的人数 */
int flag=1;
rear=l->next;
while(flag)
{
if(x!=(-1)) /*当输入的号码为-1时,结束输出 */
{
s=(personlist)malloc(sizeof(person));
scanf("%d,%d",&x,&y);
s->number=x;
s->password=y;
rear->next=s;
rear=s;
n++;
}
else
{
flag=0;
rear->next=l->next; /* 让末尾结点指针指向头结点 */
}
}
return n;
}
/* 成功建立了一个链表 */
int showlist(personlist l,int k)
{
person *p;
int n;
int flag;
p=l->next->next;
n=1;
flag=1;
while(flag)
{
if(n<=k)
{
printf("%d",*p);
p=p->next;
n++;
}
else
flag=0;
}
return n;
}
/* 为了检验,输出所有人的密码 */
void yuesefu(person *l,int m)
{
person *p;
p=l->next;
while(p->next!=l->next)
{
p=p->next;
if((p->number)==m)
{
printf("%d,%d",p->number,p->password);
m=(p->password);
}
Dellist(l,m);
}
}
/* 让指针在链表上移动并查找与m相匹配密码的人,输出,且将其删除 */
int main()
{
person *l;
initlist(l);
int y;
y=createlist(l);
showlist(l,y);
int x;
x=20;
yuesefu(l,x);
return 0;
}
/* 编写主函数 */