《C算法》——基本数据结构及其算法
2006-09-28 16:20
351 查看
数组
-----------------------------------------------------------------------------------------------------
厄拉多塞素数筛选法
求出小于N的所有素数(若i为素数,则设置a[i]为1;不是素数则设为0)
#define N 1000
main()
...{
int i, j, a
;
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
, *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;
}
-----------------------------------------------------------------------------------------------------
厄拉多塞素数筛选法
求出小于N的所有素数(若i为素数,则设置a[i]为1;不是素数则设为0)
#define N 1000
main()
...{
int i, j, a
;
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
, *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;
}
相关文章推荐
- 浅谈算法和数据结构: 六 符号表及其基本实现
- 浅谈算法和数据结构(6):符号表及其基本实现
- 浅谈算法和数据结构: 六 符号表及其基本实现
- 浅谈算法和数据结构: 二 基本排序算法
- 数据结构-绪论-算法及其描述
- 基本数据结构和算法回顾
- 常用到的基本算法及其实现
- 链表_第10章_基本数据结构_算法导论
- 算法导论笔记:10基本数据结构(番外)
- 【数据结构】算法基本概述
- 【数据结构与算法】基本数据结构——队列的顺序表示
- 常用的数据结构及其算法
- 数据结构大学教程之数据结构及其基本概念(1)
- 南邮数据结构、算法实践周基础题3(哈夫曼树及其编码)
- 详解神经网络算法所需最基础数据结构Tensor及其相关操作
- Java数据结构与算法之数据结构-逻辑结构-线性结构(9)------Java线性结构概念及其基本操作
- C语言数据结构----算法基本知识和静态表
- 网页爬虫及其用到的算法和数据结构
- 网页爬虫及其用到的算法和数据结构
- 《数据结构和算法分析》具有O(logN)对数特点的三个基本算法