关于约瑟夫环的问题
谁帮我看下这个程序,关于约瑟夫环的,只给出了部分答案,是在找不到错误在哪里啊!
- C/C++ code
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node* link;
}linkNode;
linkNode* CreatLink(int len)
{
int i;
linkNode *head, *s, *p;
if ((head = (linkNode*)malloc(sizeof(linkNode))) == NULL)
{
printf("分配内存空间失败!");
exit(1);
}
head->data = 0;
head->link = NULL;
p = head;
for (i = 0; i < len; i++)
{
if ((s = (linkNode*)malloc(sizeof(linkNode))) == NULL)
{
printf("分配空间失败\n");
exit(1);
}
s->data = i + 1;
s->link = NULL;
p->link = s;
p = s;
}
s->link = head->link;
return head;
}
void delNode(linkNode* node)
{
linkNode *temp;
temp = node->link;
node->data = temp->data;
node->link = temp->link;
free(temp);
}
int main()
{
linkNode* head;
linkNode *p, *q;
int i = 0;
head = CreatLink(10);
p = head->link;
while (p->link != p)
{
i++;
q = 0;
if (i % 3 == 0)
{
q = p;
p = p->link;
printf("%3d", q->data);
delNode(q);
}
else
{
p = p->link;
}
}
return 0;
}
[解决办法]
- C/C++ code
#include <stdio.h>#include <stdlib.h>typedef struct Node{ int data; struct Node* link;}linkNode;linkNode* CreatLink(int len){ int i; linkNode *head, *s, *p; if ((head = (linkNode*)malloc(sizeof(linkNode))) == NULL) { printf("分配内存空间失败!"); exit(1); } head->data = 0; head->link = NULL; p = head; for (i = 0; i < len; i++) { if ((s = (linkNode*)malloc(sizeof(linkNode))) == NULL) { printf("分配空间失败\n"); exit(1); } s->data = i + 1; s->link = NULL; p->link = s; p = s; } s->link = head->link; return head;}void delNode(linkNode* pre,linkNode*p)//mark{ pre->link=p->link; p=p->link;}int main(){ linkNode* head; linkNode *p, *q; int i = 1;//mark head = CreatLink(10); p = head->link; while (p->link != p) { q = p;//mark p = p->link; i++; if (i % 3 == 0) { printf("%3d", p->data); delNode(q,p); } } return 0;}
[解决办法]
删除节点不够彻底.
- C/C++ code
#include <stdio.h>#include <stdlib.h>typedef struct Node{ int data; struct Node* link;} linkNode;linkNode* CreatLink(int len){ int i; linkNode *head, *s, *p; if ((head = (linkNode*)malloc(sizeof(linkNode))) == NULL) { printf("分配内存空间失败!"); exit(1); } head->data = 0; head->link = NULL; p = head; for (i = 0; i < len; i++) { if ((s = (linkNode*)malloc(sizeof(linkNode))) == NULL) { printf("分配空间失败\n"); exit(1); } s->data = i + 1; s->link = NULL; p->link = s; p = s; } /*s->link = head->link;*/ p->link = head; return head;}void delNode(linkNode* node){ linkNode *temp; temp = node->link; node->data = temp->data; node->link = temp->link; free(temp);}int main(){ linkNode *head; linkNode *p, *q, *pre; int i = 0; head = CreatLink(10); p = head->link; while (p->link != p) { //printf("head=%p, p=%p\n", head, p); if(head == p) { /*跳过头结点*/ p = p->link; continue; } i++; //q = 0; q = NULL; if (i % 3 == 0) { q = p; p = p->link; printf("%3d", q->data); //delNode(q); pre->link = p; free(q); q = NULL; } else { pre = p; p = p->link; } } return 0;}
[解决办法]
《C++数据结构与经典问题》这本书上有个完整的例子,你可以研究下
或者自己试着调试下,找到错误
[解决办法]
我原来编过的一个程序,希望对你有帮助
- C/C++ code
#include<stdio.h>#include<malloc.h>typedef struct Node//节点定义,包含序号num及密码code{ int num,code; struct Node *next;}Node,*Linklist;Linklist initCycList()//初始化单循环链表(带头结点){ Linklist L; L=(Linklist)malloc(sizeof(Node)); L->code=-1; L->num=0; L->next=L;//L->next指向头结点 return L;}void CreatCycList(Linklist L)/*输入数据创建约瑟夫环表*/{ int num,n; int j; Node *p,*r; r = L; j = 1; scanf("%d",&n); printf("请输入成员的密码:"); while(j <= n) { scanf("%d",&num); p=(Node *)malloc(sizeof(struct Node)); p->code=num; p->num= j; r->next=p; r=p; j++; } r->next=L;}void main(){ Linklist L0; int i=0,m; Node *p,*f,*q; L0=initCycList(); printf("这是一个约瑟夫环问题\n"); printf("请输入成员数:\n"); CreatCycList(L0); printf("请输入第一个m的值: \n"); scanf("%d",&m); printf("出列顺序为:\n"); p=L0;//p指向头结点 while(p->next!=p) { f=p;//f始终指向p的前驱 p=p->next; if(p==L0) { f=p; p=p->next; } i++; if(i==m) { printf("%d ",p->num); m=p->code; f->next=p->next; q=p; free(q); p=f; i=0; } } printf("\n");}