#include <stdio.h>
#include <stdlib.h>
/* #define DEBUG */
#if defined(DEBUG)
#include "xmalloc.h"
#else
#define xmalloc(x, y) malloc(x)
#define xfree(x, y) free(x)
#define xrealloc(x, y, z) realloc(x, y)
#define xmallocdump()
#endif
#define ID_DNODE 1001
typedef int T;
struct dnode {
T data;
struct dnode *prev;
struct dnode *next;
};
void dnode_init(struct dnode **root) {
if ((*root = xmalloc(sizeof(struct dnode), ID_DNODE)) != 0) {
(*root)->prev = (*root)->next = *root;
}
}
void dnode_insert(struct dnode *root, T data) {
struct dnode *p;
if ((p = xmalloc(sizeof(struct dnode), ID_DNODE)) != 0) {
p->data = data;
p->next = root->next;
p->prev = root;
root->next->prev = p;
root->next = p;
}
}
void dnode_delete(struct dnode *root, T data) {
struct dnode *p, *q;
p = root->next;
while (p != root) {
if (p->data == data) {
p->prev->next = p->next;
p->next->prev = p->prev;
q = p->next;
xfree(p, ID_DNODE);
p = q;
} else {
p = p->next;
}
}
}
int dnode_len(struct dnode *root) {
struct dnode *p;
int n;
for (n = 0, p = root->next; p != root; n++, p = p->next)
;
return n;
}
void dnode_dump(struct dnode *root) {
struct dnode *p;
for (p = root->next; p != root; p = p->next)
printf("%d, ", p->data);
putchar('\n');
}
void dnode_release(struct dnode **root) {
struct dnode *p, *q;
if (*root != 0) {
for (p = (*root)->next; p != *root; p = q) {
q = p->next;
xfree(p, ID_DNODE);
}
xfree(*root, ID_DNODE);
*root = 0;
}
}
int main() {
struct dnode *root, *p, *q;
int n, m, i;
root = 0;
dnode_init(&root);
printf("n = "); scanf("%d", &n);
printf("m = "); scanf("%d", &m);
for (i = n; i > 0; --i)
dnode_insert(root, i);
p = root->next;
while (dnode_len(root) > 0) {
for (i = 1; i < m; i++) {
p = p->next;
if (p == root)
p = p->next;
}
printf("%d, ", p->data);
q = p->next;
dnode_delete(root, p->data); /* a little ineficiently */
p = q;
if (p == root)
p = p->next;
}
putchar('\n');
dnode_release(&root);
xmallocdump();
return 0;
}
/* end */