我的约瑟夫代码有问题,可能free()空间,没有释放掉,导致队列序号重复出现
/*********************************************************************
程序名:
版权:
作者:
日期: 2024-04-14 10:05
说明:
*********************************************************************/
#include <iostream>
#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
using namespace std;
typedef struct node {
ElemType no; //存放编号
struct node *next;
} QNode;
//typedef struct {
// QNode *front;
// QNode *rear;
//} LQueue;
void InitQueue(QNode *&lq) {
lq = NULL;
}
void DestroyQueue(QNode *&lq) {
QNode *pre, *p;
if (lq != NULL) {
if (lq->next == lq)
free(lq);
else {
pre = lq;
p = pre->next;
while (p != lq) {
free(pre);
pre = p;
p = p->next;
}
free(pre);
}
}
}
void EnQueue(QNode *&lq, ElemType x) {
QNode *s;
s = (QNode *)malloc(sizeof(QNode));
s->no = x;
if (lq == NULL) {
lq = s;
lq->next = lq;
} else {
s->next = lq->next;
lq->next = s;
lq = s;
}
}
int DeQueue(QNode *&lq, ElemType &x) {
QNode *s;
if (lq == NULL)
return 0;
if (lq->next == lq) {
x = lq->no;
free(lq);
lq = NULL;
} else {
s = lq->next;
x = s->no;
lq->next = s->next;
free(s);
}
return 1;
}
int GetHead(QNode *lq, ElemType &x) {
if (lq == NULL)
return 0;
x = lq->next->no;
return 1;
}
int QueueEmpty(QNode *lq) {
if (lq == NULL)
return 1;
else
return 0;
}
void Joseph(int &n, int &m, QNode *&lq) {
int i, j;
QNode *p, *q;
for (i = 1; i <= n; i++) {
p = lq;
j = 1;
while (j < m ) {
j++;
p = p->next;
}
q = p->next;
printf("%d", q->no);
p->next = q->next;
DeQueue(lq, q->no);
lq = p->next;
}
}
int main() {
QNode *q, *p, *lq;
ElemType tem[20];
InitQueue(lq);
int n, i, j, m;
printf("队列长度:");
scanf("%d", &n);
printf("队列序号:");
for (i = 0; i < n; i++)
scanf("%d", &tem[i]);
printf("\n");
printf("出队序号:");
scanf("%d", &m);
printf("\n");
for (i = 0; i <= n; i++) {
EnQueue(lq, tem[i]);
}
printf("n=%d,m=%d的约瑟夫序列:", n, m);
Joseph(n, m, lq);
}
运行结果