数组
-----------------------------------------------------------------------------------------------------
厄拉多塞素数筛选法
求出小于N的所有素数(若i为素数,则设置a[i]为1;不是素数则设为0)
#define N 1000

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("%d", i);
}
printf(" ");
}


-----------------------------------------------------------------------------------------------------
链表
-----------------------------------------------------------------------------------------------------
定义:
typedef struct node* link;
struct node

...{
Item item;
link next;
}
-----------------------------------------------------------------------------------------------------
约瑟夫问题
N个人排成一个圆周,沿着圆周每次数M个人,就排除对应者,问最后剩下的人是谁。
#include <stdlib.h>
typedef struct node* link;
struct node

...{
Item item;
link next;
}
main(int argc, char *argv[])

...{
int i, N, M;
N = atoi(argv[1]);
M = atoi(argv[2]);
link t = (node*)malloc(sizeof(node));
link x = t;
t->item = 1;
t->next = t;
for(i = 2; i <= N; i++) //构造环形链表

...{
x->next = (node*)malloc(sizeof(node));
x = x->next;
x->item = i;
x->next = t;
}
while(x != x->next) //判断是否只剩下一个元素

...{
for(i = 1; i < M; i++) x = x->next;
x->next = x->next->next; //删除第M个节点
}
printf("%d ", 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;
}

-----------------------------------------------------------------------------------------------------
串
-----------------------------------------------------------------------------------------------------
串指变长字符数组,由一个起点以及一个标记其结尾的串终止符来定义
-----------------------------------------------------------------------------------------------------
基本串处理运算
计算串长度 strlen(a)
for(int i = 0; a[i] != '/0'; i++) return i;
复制 strcpy(a, b)
for(int i = 0; (a[i] = b[i]) != '/0'; i++)
比较 strcmp(a, b)
for(int i = 0; a[i] == b[i]; i++);
if(a[i] == 0) return 0;
return a[i] - b[i];
追加 strcat(a, b)
strcpy(a+strlen(a), b)
-----------------------------------------------------------------------------------------------------
串搜索
#include <stdio.h>
#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);
}
}

复合数据结构
-----------------------------------------------------------------------------------------------------
矩阵相乘
-----------------------------------------------------------------------------------------------------
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
for(int k = 0; k < N; k++)
c[i][j] += a[i][k] * b[k][j];

-----------------------------------------------------------------------------------------------------
二维数组分配
int **malloc2d(int r, int c)

...{
int **t = (int *)malloc(r * sizeof(int *));
for(int i = 0; i < c; i++)
t[i] = (int)malloc(c * sizeof(int));
return t;
}

-----------------------------------------------------------------------------------------------------
栈(LIFO)
-----------------------------------------------------------------------------------------------------
后缀表达式求值
int Func(char *exp)

...{
char *a = exp;
int i, N = 0;

while(a[i++])

...{
N++;
}
stack s;
STACKinit(s, N);
for(i = 0; i< N; i++)

...{
if(a[i] == '+')
STACKpush(s, STACKpop(s) + STACKpop(s));

if(a[i] == '*')
STACKpush(s, STACKpop(s) * STACKpop(s));

if((a[i] >= '0') && (a[i] <= '9'))
STACKpush(s, 0);

while((a[i] >= '0') && (a[i] <= '9'))
STACKpush(s, 10 * STACKpop(s) + (a[i++] - '0'));
}
return STACKpop(s);
}


-----------------------------------------------------------------------------------------------------
中缀表达式转后缀表达式
char* Func(char *exp)

...{
int N = 0, i = 0, j = 0;
while(exp[i++])

...{
N++;
}
char* result = (char*)malloc(N * sizeof(char));
stack s;
STACKinit(s, N);
for(int i = 0; i < N; i++)

...{
if(exp[i] == ')')
result[j++] = STACKpop(s);
if((exp[i] == '+') || (exp[i] == '*'))
STACKpush(s, exp[i]);
if((exp[i] >= '0') && (exp[i] <= '9'))
result[j++] = exp[i];
}
result[j] = 0;
return result;
}