This file contains (part of) the code from "Algorithms in C, Third Edition, Parts 1-4," by Robert Sedgewick, and is covered under the copyright and warranty notices in that book. Permission is granted for this code to be used for educational purposes in association with the text, and for other uses not covered by copyright laws, provided that the following notice is included with the code: "This code is from "Algorithms in C, Third Edition," by Robert Sedgewick, Addison Wesley Longman, 1998." Commercial uses of this code require the explicit written permission of the publisher. Send your request for permission, stating clearly what code you would like to use, and in what specific way, to: aw.cse@aw.com CHAPTER 3. Elementary Data Structures ----- #include int lg(int); main() { int i, N; for (i = 1, N = 10; i <= 6; i++, N *= 10) printf("%7d %2d %9d\n", N, lg(N), N*lg(N)); } int lg(int N) { int i; for (i = 0; N > 0; i++, N /= 2) ; return i; } ----- #include typedef int numType; numType randNum() { return rand(); } main(int argc, char *argv[]) { int i, N = atoi(argv[1]); float m1 = 0.0, m2 = 0.0; numType x; for (i = 0; i < N; i++) { x = randNum(); m1 += ((float) x)/N; m2 += ((float) x*x)/N; } printf(" Average: %f\n", m1); printf("Std. deviation: %f\n", sqrt(m2-m1*m1)); } ----- typedef struct { float x; float y; } point; float distance(point a, point b); ----- #include #include "Point.h" float distance(point a, point b) { float dx = a.x - b.x, dy = a.y - b.y; return sqrt(dx*dx + dy*dy); } ----- #define N 10000 main() { int i, j, a[N]; for (i = 2; i < N; i++) a[i] = 1; for (i = 2; i < N; i++) if (a[i]) for (j = i; j < N/i; j++) a[i*j] = 0; for (i = 2; i < N; i++) if (a[i]) printf("%4d ", i); printf("\n"); } ----- #include main(int argc, char *argv[]) { long int i, j, N = atoi(argv[1]); int *a = malloc(N*sizeof(int)); if (a == NULL) { printf("Insufficient memory.\n"); return; } ... ----- #include int heads() { return rand() < RAND_MAX/2; } main(int argc, char *argv[]) { int i, j, cnt; int N = atoi(argv[1]), M = atoi(argv[2]); int *f = malloc((N+1)*sizeof(int)); for (j = 0; j <= N; j++) f[j] = 0; for (i = 0; i < M; i++, f[cnt]++) for (cnt = 0, j = 0; j <= N; j++) if (heads()) cnt++; for (j = 0; j <= N; j++) { printf("%2d ", j); for (i = 0; i < f[j]; i+=10) printf("*"); printf("\n"); } } ----- #include #include #include #include "Point.h" float randFloat() { return 1.0*rand()/RAND_MAX; } main(int argc, char *argv[]) { float d = atof(argv[2]); int i, j, cnt = 0, N = atoi(argv[1]); point *a = malloc(N*(sizeof(*a))); for (i = 0; i < N; i++) { a[i].x = randFloat(); a[i].y = randFloat(); } for (i = 0; i < N; i++) for (j = i+1; j < N; j++) if (distance(a[i], a[j]) < d) cnt++; printf("%d edges shorter than %f\n", cnt, d); } ----- #include typedef struct node* link; struct node { int item; link next; }; main(int argc, char *argv[]) { int i, N = atoi(argv[1]), M = atoi(argv[2]); link t = malloc(sizeof *t), x = t; t->item = 1; t->next = t; for (i = 2; i <= N; i++) { x = (x->next = malloc(sizeof *x)); x->item = i; x->next = t; } while (x != x->next) { for (i = 1; i < M; i++) x = x->next; x->next = x->next->next; N--; } printf("%d\n", x->item); } ----- link reverse(link x) { link t, y = x, r = NULL; while (y != NULL) { t = y->next; y->next = r; r = y; y = t; } return r; } ----- struct node heada, headb; link t, u, x, a = &heada, b; for (i = 0, t = a; i < N; i++) { t->next = malloc(sizeof *t); t = t->next; t->next = NULL; t->item = rand() % 1000; } b = &headb; b->next = NULL; for (t = a->next; t != NULL; t = u) { u = t->next; for (x = b; x->next != NULL; x = x->next) if (x->next->item > t->item) break; t->next = x->next; x->next = t; } ----- typedef struct node* link; struct node { itemType item; link next; }; typedef link Node; void initNodes(int); link newNode(int); void freeNode(link); void insertNext(link, link); link deleteNext(link); link Next(link); int Item(link); ----- #include "list.h" main(int argc, char *argv[]) { int i, N = atoi(argv[1]), M = atoi(argv[2]); Node t, x; initNodes(N); for (i = 2, x = newNode(1); i <= N; i++) { t = newNode(i); insertNext(x, t); x = t; } while (x != Next(x)) { for (i = 1; i < M; i++) x = Next(x); freeNode(deleteNext(x)); } printf("%d\n", Item(x)); } ----- #include #include "list.h" link freelist; void initNodes(int N) { int i; freelist = malloc((N+1)*(sizeof *freelist)); for (i = 0; i < N+1; i++) freelist[i].next = &freelist[i+1]; freelist[N].next = NULL; } link newNode(int i) { link x = deleteNext(freelist); x->item = i; x->next = x; return x; } void freeNode(link x) { insertNext(freelist, x); } void insertNext(link x, link t) { t->next = x->next; x->next = t; } link deleteNext(link x) { link t = x->next; x->next = t->next; return t; } link Next(link x) { return x->next; } int Item(link x) { return x->item; } ----- #include #define N 10000 main(int argc, char *argv[]) { int i, j, t; char a[N], *p = argv[1]; for (i = 0; i < N-1; a[i] = t, i++) if ((t = getchar()) == EOF) break; a[i] = 0; for (i = 0; a[i] != 0; i++) { for (j = 0; p[j] != 0; j++) if (a[i+j] != p[j]) break; if (p[j] == 0) printf("%d ", i); } printf("\n"); } ----- int **malloc2d(int r, int c) { int i; int **t = malloc(r * sizeof(int *)); for (i = 0; i < r; i++) t[i] = malloc(c * sizeof(int)); return t; } ----- #include #include #include #define Nmax 1000 #define Mmax 10000 char buf[Mmax]; int M = 0; int compare(void *i, void *j) { return strcmp(*(char **)i, *(char **)j); } main() { int i, N; char* a[Nmax]; for (N = 0; N < Nmax; N++) { a[N] = &buf[M]; if (scanf("%s", a[N]) == EOF) break; M += strlen(a[N])+1; } qsort(a, N, sizeof(char*), compare); for (i = 0; i < N; i++) printf("%s\n", a[i]); } ----- #include #include main() { int i, j, adj[V][V]; for (i = 0; i < V; i++) for (j = 0; j < V; j++) adj[i][j] = 0; for (i = 0; i < V; i++) adj[i][i] = 1; while (scanf("%d %d\n", &i, &j) == 2) { adj[i][j] = 1; adj[j][i] = 1; } } ----- #include #include typedef struct node *link; struct node { int v; link next; }; link NEW(int v, link next) { link x = malloc(sizeof *x); x->v = v; x->next = next; return x; } main() { int i, j; link adj[V]; for (i = 0; i < V; i++) adj[i] = NULL; while (scanf("%d %d\n", &i, &j) == 2) { adj[j] = NEW(i, adj[j]); adj[i] = NEW(j, adj[i]); } } ----- #include #include #include #include "Point.h" typedef struct node* link; struct node { point p; link next; }; link **grid; int G; float d; int cnt = 0; gridinsert(float x, float y) { int i, j; link s; int X = x*G +1; int Y = y*G+1; link t = malloc(sizeof *t); t->p.x = x; t->p.y = y; for (i = X-1; i <= X+1; i++) for (j = Y-1; j <= Y+1; j++) for (s = grid[i][j]; s != NULL; s = s->next) if (distance(s->p, t->p) < d) cnt++; t->next = grid[X][Y]; grid[X][Y] = t; } main(int argc, char *argv[]) { int i, j, N = atoi(argv[1]); d = atof(argv[2]); G = 1/d; grid = malloc2d(G+2, G+2); for (i = 0; i < G+2; i++) for (j = 0; j < G+2; j++) grid[i][j] = NULL; for (i = 0; i < N; i++) gridinsert(randFloat(), randFloat()); printf("%d edges shorter than %f\n", cnt, d); } ----- #include #include typedef int numType; #define R 1000 numType randNum() { return rand() % R; } main(int argc, char *argv[]) { int i, N = atoi(argv[1]); int *f = malloc(R*sizeof(int)); float m1 = 0.0, m2 = 0.0, t = 0.0; numType x; for (i = 0; i < R; i++) f[i] = 0; for (i = 0; i < N; i++) { f[x = randNum()]++; m1 += (float) x/N; m2 += (float) x*x/N; } for (i = 0; i < R; i++) t += f[i]*f[i]; printf(" Average: %f\n", m1); printf("Std. deviation: %f\n", sqrt(m2-m1*m1)); printf(" Chi-square: %f\n", (R*t/N)-N); } ----------