📄 algorithms in c, parts 1-4 (fundamental algorithms, data structures, sorting, searching) code.txt
字号:
{ int i = x; while (i != id[i]) i = id[i]; return i; }int UFfind(int p, int q) { return (find(p) == find(q)); }int UFunion(int p, int q) { int i = find(p), j = find(q); if (i == j) return; if (sz[i] < sz[j]) { id[i] = j; sz[j] += sz[i]; } else { id[j] = i; sz[i] += sz[j]; } }-----void QUEUEinit(int); int QUEUEempty();void QUEUEput(Item);Item QUEUEget();-----#include <stdlib.h>#include "Item.h"#include "QUEUE.h"typedef struct QUEUEnode* link;struct QUEUEnode { Item item; link next; };static link head, tail;link NEW(Item item, link next) { link x = malloc(sizeof *x); x->item = item; x->next = next; return x; } void QUEUEinit(int maxN) { head = NULL; }int QUEUEempty() { return head == NULL; }QUEUEput(Item item) { if (head == NULL) { head = (tail = NEW(item, head)); return; } tail->next = NEW(item, tail->next); tail = tail->next; }Item QUEUEget() { Item item = head->item; link t = head->next; free(head); head = t; return item; }-----#include <stdlib.h>#include "Item.h"static Item *q;static int N, head, tail;void QUEUEinit(int maxN) { q = malloc((maxN+1)*sizeof(Item)); N = maxN+1; head = N; tail = 0; }int QUEUEempty() { return head % N == tail; }void QUEUEput(Item item) { q[tail++] = item; tail = tail % N; }Item QUEUEget() { head = head % N; return q[head++]; }-----#include <stdlib.h>static int *s, *t;static int N;void STACKinit(int maxN) { int i; s = malloc(maxN*sizeof(int)); t = malloc(maxN*sizeof(int)); for (i = 0; i < maxN; i++) t[i] = 0; N = 0; }int STACKempty() { return !N; }void STACKpush(int item) { if (t[item] == 1) return; s[N++] = item; t[item] = 1; }int STACKpop() { N--; t[s[N]] = 0; return s[N]; }-----#include <stdio.h>#include <math.h>#include "COMPLEX.h"#define PI 3.141592625main(int argc, char *argv[]) { int i, j, N = atoi(argv[1]); Complex t, x; printf("%dth complex roots of unity\n", N); for (i = 0; i < N; i++) { float r = 2.0*PI*i/N; t = COMPLEXinit(cos(r), sin(r)); printf("%2d %6.3f %6.3f ", i, Re(t), Im(t)); for (x = t, j = 0; j < N-1; j++) x = COMPLEXmult(t, x); printf("%6.3f %6.3f\n", Re(x), Im(x)); } }-----typedef struct { float Re; float Im; } Complex;Complex COMPLEXinit(float, float); float Re(Complex); float Im(Complex);Complex COMPLEXmult(Complex, Complex);-----#include "COMPLEX.h"Complex COMPLEXinit(float Re, float Im) { Complex t; t.Re = Re; t.Im = Im; return t; }float Re(Complex z) { return z.Re; }float Im(Complex z) { return z.Im; }Complex COMPLEXmult(Complex a, Complex b) { Complex t; t.Re = a.Re*b.Re - a.Im*b.Im; t.Im = a.Re*b.Im + a.Im*b.Re; return t; }-----typedef struct complex *Complex;Complex COMPLEXinit(float, float); float Re(Complex); float Im(Complex);Complex COMPLEXmult(Complex, Complex);-----#include <stdlib.h>#include "COMPLEX.h"struct complex { float Re; float Im; };Complex COMPLEXinit(float Re, float Im) { Complex t = malloc(sizeof *t); t->Re = Re; t->Im = Im; return t; }float Re(Complex z) { return z->Re; }float Im(Complex z) { return z->Im; }Complex COMPLEXmult(Complex a, Complex b) { return COMPLEXinit(Re(a)*Re(b) - Im(a)*Im(b), Re(a)*Im(b) + Im(a)*Re(b)); }-----typedef struct queue *Q;void QUEUEdump(Q); Q QUEUEinit(int maxN); int QUEUEempty(Q);void QUEUEput(Q, Item);Item QUEUEget(Q);-----#include <stdio.h>#include <stdlib.h>#include "Item.h"#include "QUEUE.h"#define M 10main(int argc, char *argv[]) { int i, j, N = atoi(argv[1]); Q queues[M]; for (i = 0; i < M; i++) queues[i] = QUEUEinit(N); for (i = 0; i < N; i++) QUEUEput(queues[rand() % M], j); for (i = 0; i < M; i++, printf("\n")) for (j = 0; !QUEUEempty(queues[i]); j++) printf("%3d ", QUEUEget(queues[i])); }-----#include <stdlib.h>#include "Item.h"#include "QUEUE.h"typedef struct QUEUEnode* link;struct QUEUEnode { Item item; link next; };struct queue { link head; link tail; };link NEW(Item item, link next) { link x = malloc(sizeof *x); x->item = item; x->next = next; return x; } Q QUEUEinit(int maxN) { Q q = malloc(sizeof *q); q->head = NULL; q->tail = NULL; return q; }int QUEUEempty(Q q) { return q->head == NULL; }void QUEUEput(Q q, Item item) { if (q->head == NULL) { q->tail = NEW(item, q->head) q->head = q->tail; return; } q->tail->next = NEW(item, q->tail->next); q->tail = q->tail->next; }Item QUEUEget(Q q) { Item item = q->head->item; link t = q->head->next; free(q->head); q->head = t; return item; }-----#include <stdio.h>#include <stdlib.h>#include "POLY.h"main(int argc, char *argv[]) { int N = atoi(argv[1]); float p = atof(argv[2]); Poly t, x; int i, j; printf("Binomial coefficients\n"); t = POLYadd(POLYterm(1, 1), POLYterm(1, 0)); for (i = 0, x = t; i < N; i++) { x = POLYmult(t, x); showPOLY(x); } printf("%f\n", POLYeval(x, p)); }-----typedef struct poly *Poly; void showPOLY(Poly); Poly POLYterm(int, int); Poly POLYadd(Poly, Poly); Poly POLYmult(Poly, Poly);float POLYeval(Poly, float);-----#include <stdlib.h>#include "POLY.h"struct poly { int N; int *a; };Poly POLYterm(int coeff, int exp) { int i; Poly t = malloc(sizeof *t); t->a = malloc((exp+1)*sizeof(int)); t->N = exp+1; t->a[exp] = coeff; for (i = 0; i < exp; i++) t->a[i] = 0; return t; } Poly POLYadd(Poly p, Poly q) { int i; Poly t; if (p->N < q->N) { t = p; p = q; q = t; } for (i = 0; i < q->N; i++) p->a[i] += q->a[i]; return p; }Poly POLYmult(Poly p, Poly q) { int i, j; Poly t = POLYterm(0, (p->N-1)+(q->N-1)); for (i = 0; i < p->N; i++) for (j = 0; j < q->N; j++) t->a[i+j] += p->a[i]*q->a[j]; return t; }float POLYeval(Poly p, float x) { int i; double t = 0.0; for (i = p->N-1; i >= 0; i--) t = t*x + p->a[i]; return t; }----------CHAPTER 5. Recursion and Trees-----int factorial(int N) { if (N == 0) return 1; return N*factorial(N-1); } -----int puzzle(int N) { if (N == 1) return 1; if (N % 2 == 0) return puzzle(N/2); else return puzzle(3*N+1); } -----int gcd(int m, int n) { if (n == 0) return m; return gcd(n, m % n); } -----char *a; int i;int eval() { int x = 0; while (a[i] == ' ') i++; if (a[i] == '+') { i++; return eval() + eval(); } if (a[i] == '*') { i++; return eval() * eval(); } while ((a[i] >= '0') && (a[i] <= '9')) x = 10*x + (a[i++]-'0'); return x; }-----int count(link x) { if (x == NULL) return 0; return 1 + count(x->next); }void traverse(link h, void (*visit)(link)) { if (h == NULL) return; (*visit)(h); traverse(h->next, visit); }void traverseR(link h, void (*visit)(link)) { if (h == NULL) return; traverseR(h->next, visit); (*visit)(h); }link delete(link x, Item v) { if (x == NULL) return NULL; if (eq(x->item, v)) { link t = x->next; free(x); return t; } x->next = delete(x->next, v); return x; }-----Item max(Item a[], int l, int r) { Item u, v; int m = (l+r)/2; if (l == r) return a[l]; u = max(a, l, m); v = max(a, m+1, r); if (u > v) return u; else return v; }-----void hanoi(int N, int d) { if (N == 0) return; hanoi(N-1, -d); shift(N, d); hanoi(N-1, -d); } -----rule(int l, int r, int h) { int m = (l+r)/2; if (h > 0) { rule(l, m, h-1); mark(m, h); rule(m, r, h-1); } }-----rule(int l, int r, int h) { int i, j, t; for (t = 1, j = 1; t <= h; j += j, t++) for (i = 0; l+j+i <= r; i += j+j) mark(l+j+i, t); }-----int F(int i) { if (i < 1) return 0; if (i == 1) return 1; return F(i-1) + F(i-2); }-----int F(int i) { int t; if (knownF[i] != unknown) return knownF[i]; if (i == 0) t = 0; if (i == 1) t = 1; if (i > 1) t = F(i-1) + F(i-2); return knownF[i] = t; }-----int knap(int cap) { int i, space, max, t; for (i = 0, max = 0; i < N; i++) if ((space = cap-items[i].size) >= 0) if ((t = knap(space) + items[i].val) > max) max = t; return max; }-----int knap(int M) { int i, space, max, maxi, t; if (maxKnown[M] != unknown) return maxKnown[M]; for (i = 0, max = 0; i < N; i++) if ((space = M-items[i].size) >= 0) if ((t = knap(space) + items[i].val) > max) { max = t; maxi = i; } maxKnown[M] = max; itemKnown[M] = items[maxi]; return max; }-----void traverse(link h, void (*visit)(link)) { if (h == NULL) return; (*visit)(h); traverse(h->l, visit); traverse(h->r, visit); }-----void traverse(link h, void (*visit)(link)) { STACKinit(max); STACKpush(h); while (!STACKempty()) { (*visit)(h = STACKpop()); if (h->r != NULL) STACKpush(h->r); if (h->l != NULL) STACKpush(h->l); } }-----void traverse(link h, void (*visit)(link)) { QUEUEinit(max); QUEUEput(h); while (!QUEUEempty()) { (*visit)(h = QUEUEget()); if (h->l != NULL) QUEUEput(h->l); if (h->r != NULL) QUEUEput(h->r); } }-----int count(link h) { if (h == NULL) return 0; return count(h->l) + count(h->r) + 1; }int height(link h) { int u, v; if (h == NULL) return -1; u = height(h->l); v = height(h->r); if (u > v) return u+1; else return v+1; }-----void printnode(char c, int h) { int i; for (i = 0; i < h; i++) printf(" "); printf("%c\n", c); }void show(link x, int h) { if (x == NULL) { printnode("*", h); return; } show(x->r, h+1); printnode(x->item, h); show(x->l, h+1); }-----typedef struct node *link;struct node { Item item; link l, r };link NEW(Item item, link l, link r) { link x = malloc(sizeof *x); x->item = item; x->l = l; x->r = r; return x; }link max(Item a[], int l, int r) { int m = (l+r)/2; Item u, v; link x = NEW(a[m], NULL, NULL); if (l == r) return x; x->l = max(a, l, m); x->r = max(a, m+1, r); u = x->l->item; v = x->r->item; if (u > v) x->item = u; else x->item = v; return x; }-----char *a; int i;typedef struct Tnode* link;struct Tnode { char token; link l, r; };link NEW(char token, link l, link r) { link x = malloc(sizeof *x); x->token = token; x->l = l; x->r = r; return x; }link parse() { char t = a[i++]; link x = NEW(t, NULL, NULL); if ((t == '+') || (t == '*')) { x->l = parse(); x->r = parse(); } return x; }-----void traverse(int k, void (*visit)(int)) { link t; (*visit)(k); visited[k] = 1; for (t = adj[k]; t != NULL; t = t->next) if (!visited[t->v]) traverse(t->v, visit); }-----void traverse(int k, void (*visit)(int)) { link t; QUEUEinit(V); QUEUEput(k); while (!QUEUEempty()) if (visited[k = QUEUEget()] == 0) { (*visit)(k); visited[k] = 1; for (t = adj[k]; t != NULL; t = t->next) if (visited[t->v] == 0) QUEUEput(t->v); } }---------------CHAPTER 6. Elementary Sorting Methods-----#include <stdio.h>#include <stdlib.h>typedef int Item;#define key(A) (A)#define less(A, B) (key(A) < key(B))#define exch(A, B) { Item t = A; A = B; B = t; } #define compexch(A, B) if (less(B, A)) exch(A, B)void sort(Item a[], int l, int r) { int i, j; for (i = l+1; i <= r; i++) for (j = i; j > l; j--) compexch(a[j-1], a[j]); }main(int argc, char *argv[]) { int i, N = atoi(argv[1]), sw = atoi(argv[2]); int *a = malloc(N*sizeof(int)); if (sw) for (i = 0; i < N; i++) a[i] = 1000*(1.0*rand()/RAND_MAX); else while (scanf("%d", &a[N]) == 1) N++; sort(a, 0, N-1); for (i = 0; i < N; i++) printf("%3d ", a[i]); printf("\n"); }-----void selection(Item a[], int l, int r)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -