📄 algorithms in c code.txt
字号:
#include "UF.h"
main(int argc, char *argv[])
{ int p, q, N = atoi(argv[1]);
UFinit(N);
while (scanf("%d %d", &p, &q) == 2)
if (!UFfind(p, q))
{ UFunion(p, q); printf(" %d %d\n", p, q); }
}
-----
#include <stdlib.h>
#include "UF.h"
static int *id, *sz;
void UFinit(int N)
{ int i;
id = malloc(N*sizeof(int));
sz = malloc(N*sizeof(int));
for (i = 0; i < N; i++)
{ id[i] = i; sz[i] = 1; }
}
int find(int x)
{ 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.141592625
main(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 10
main(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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -