#include<stdio.h> #include<stdlib.h> // #define _CRT_SECURE_NO_WARNINGS typedef struct List{ int data; struct List *next; }list; list *InitList(list L) { L=(list)malloc(sizeof(list)); L->next=L; return L; } list *Findrear(list *l) { list *p; if(l==NULL) p=NULL; else { p=l; while(p->next!=l) p=p->next; } return p; } void Append(list *L,int n) { int i=1; while(i<=n) { if(L->next==L) { L->data=i; } else { list q=(list)malloc(sizeof (list)); list *rear; rear= Findrear(L); q->data=i; q->next=L; rear->next=q; } i++; } } void printfNumber(list *l,int m,int n) { int j=1; while(n>=3) { j++; l=l->next; if(j==m-1) { list *q=l->next; j=1; n--; printf(" %d",q->data); l->next=q->next; free(q); } } printf(" %d",l->data); printf(" %d",l->next->data); } int main() { list *l = NULL; l=InitList(l); int n; int i=1; scanf_s("%d",&n); int m; scanf_s("%d",&m); Append(l,n); printfNumber(l,m,n); return 0; }如何修改这段代码实现约瑟夫环问题
时间: 2023-12-09 17:03:30 浏览: 75
这段代码实现约瑟夫环问题的思路不太正确,需要进行较大的修改。下面是修改后的代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int num;
struct Node* next;
} node;
node* createList(int n) {
// 创建含有n个节点的单向循环链表,返回链表头指针
node* head = (node*)malloc(sizeof(node));
head->num = 1;
head->next = NULL;
node* tail = head;
for (int i = 2; i <= n; i++) {
node* p = (node*)malloc(sizeof(node));
p->num = i;
p->next = NULL;
tail->next = p;
tail = p;
}
tail->next = head; // 链接成循环链表
return head;
}
void Josephus(int m, int n) {
// 每次数m个节点,删除第m个节点,直到链表中只剩一个节点
node* head = createList(n);
node* p = head; // p指向当前节点的前一个节点
while (p->next != p) {
for (int i = 1; i < m; i++) {
p = p->next;
}
node* q = p->next; // q指向要删除的节点
printf("%d ", q->num);
p->next = q->next;
free(q);
}
printf("%d\n", p->num);
free(p);
}
int main() {
int n, m;
scanf_s("%d%d", &n, &m);
Josephus(m, n);
return 0;
}
```
修改后的代码中,使用单向循环链表来实现约瑟夫环问题。首先创建含有n个节点的单向循环链表,然后从链表头开始每次数m个节点,删除第m个节点,直到链表中只剩一个节点。在删除节点时,需要先将当前节点的前一个节点p指向要删除的节点的后一个节点,然后释放要删除的节点q的内存。最后输出剩下的节点的编号。
阅读全文