数组
-----------------------------------------------------------------------------------------------------
厄拉多塞素数筛选法
求出小于N的所有素数(若i为素数,则设置a[i]为1;不是素数则设为0)
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(" ");
}
-----------------------------------------------------------------------------------------------------
链表
-----------------------------------------------------------------------------------------------------
定义:
struct node
... {
Item item;
link next;
}
-----------------------------------------------------------------------------------------------------
约瑟夫问题
N个人排成一个圆周,沿着圆周每次数M个人,就排除对应者,问最后剩下的人是谁。
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 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)
-----------------------------------------------------------------------------------------------------
串搜索
#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 j = 0; j < N; j++ )
for(int k = 0; k < N; k++ )
c[i][j] += a[i][k] * b[k][j];
-----------------------------------------------------------------------------------------------------
二维数组分配
... {
int **t = (int *)malloc(r * sizeof(int *));
for(int i = 0; i < c; i++)
t[i] = (int)malloc(c * sizeof(int));
return t;
}
-----------------------------------------------------------------------------------------------------
栈(LIFO)
-----------------------------------------------------------------------------------------------------
后缀表达式求值
... {
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);
}
-----------------------------------------------------------------------------------------------------
中缀表达式转后缀表达式
... {
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;
}