[ create a new paste ] login | about

Link: http://codepad.org/4m6fyRj2    [ raw code | output | fork ]

C, pasted on Oct 22:
#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 */


Output:
1
Timeout


Create a new paste based on this one


Comments: