⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 algorithms in c, parts 1-4 (fundamental algorithms, data structures, sorting, searching) code.txt

📁 Algorithms in C, Parts 1-4 (Fundamental Algorithms, Data Structures, Sorting, Searching) code
💻 TXT
📖 第 1 页 / 共 5 页
字号:
  { 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 + -