您的位置:首页 > 理论基础 > 数据结构算法

《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;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: