常用C语言算法大集合_第1页
常用C语言算法大集合_第2页
常用C语言算法大集合_第3页
常用C语言算法大集合_第4页
常用C语言算法大集合_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、常用C语言算法大集合/CRC校验算法unsigned char S130; /原始数据为128字节,CRC校验2字节unsigned int CRC ( ) /CRC校验算法(共130字节)unsigned int i,j,m,n,p,q,c=0 x1021;m=S0*256+S1; /首先取两个字节,拼成16位整数,作为基数for (i=1;i=64;i+) /其余128字节分64批处理,每批2字节n=S2*i*256+S2*i+1; /取两个字节,拼成16位整数for (j=0;j16;j+) /每批计算16次,每次处理1比特p = m & 0 x8000; /保存基数的最高位q = n

2、& 0 x8000; /保存当前整数的最高位m = 1 ; n = 1 ;/两者均左移一位if (q) m+ ; /当前整数的最高位拼入基数的最低位if (p) m = c ; /如果基数移出的最高位为1,如此“减去0 x1021return m; /返回校验结果 main ( )int i;unsigned int c;for (i=0;i128;i+) Si=i;/设置128字节原始数据S128=S129=0; /将最后两个字节设置为零c = CRC ( ) ; /进展CRC校验S128=c/256;S129=c%256;/将校验结果装入最后两个字节c = CRC ( ) ; /再进展CR

3、C校验,结果应该为零S4 = 0 x20; /引入一个过失c = CRC ( ) ; /再进展CRC校验,结果不为零,发现过失S6 = 0 xff; /再引入8个过失c = CRC ( ) ; /再进展CRC校验,结果不为零,发现过失while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /8比特汉明码模拟通讯程序#defineN8/原始数据的字节数unsigned char HM16=0 x00,0 x71,0 xB2,0 xC3,0 xD4,0 xA5,0 x66,0 x17,/编码表0 xE8,0 x99,0 x5A,0 x2B,0 x3C,0 x4D,0 x8

4、E,0 xFF;unsigned char err8=0 x00,0 x40,0 x20,0 x10,0 x08,0 x04,0 x02,0 x01;/错误图样unsigned char SN=0 x12,0 x34,0 x56,0 x78,0 x9A,0 xBC,0 xDE,0 xF0;/原始数据unsigned char D2*N; /原始数据的汉明码(发送的内容)unsigned char RN; /解码结果(接收的内容)void TRANS () /编码程序(模拟发送)unsigned char c1,c2;int i,j;for (i=0,j=0;iN;i+) /每字节原始数据编码为

5、两个字节c1=Si/16; /c1为原始数据的高4位c2=Si%16; /c2为原始数据的低4位Dj+=HMc1; /按编码表对c1进展编码Dj+=HMc2; /按编码表对c2进展编码unsigned char parity (unsigned char ch ) /偶校验int i;unsigned char k=0;for (i=0;i= 1;return k;unsigned char UNHM (unsigned char ch) /汉明码解码算法unsigned char c,p,q0,q1,q2;p= parity (ch) ;/保存全字节偶校验结果q0 = parity (ch&

6、0 x4d); /对D1、D3、D5、D7进展偶校验q1 = parity (ch&0 x2b); /对D2、D3、D6、D7进展偶校验q2 = parity (ch&0 x17); /对D4、D5、D6、D7进展偶校验c = q0 | q11 | q22 ;/拼装校验结果,得到错误图样ch = errc; /按错误图样进展纠错ch &= 0 x0f ; /取出4比特信息内容if ( c & !p ) ch += 0 x20 ;/发现两个过失return ch;/将接收到的两字节信息解码拼装为一字节数据int RECEV ( ) /解码程序(模拟接收) int i,j,k=1; /初始化解码成

7、功标志unsigned char c1,c2;for (i=0,j=0;i16) k=0; c1 &= 0 x0f;/过失判断c2= UNHM(Dj+);/再解码一字节if (c216) k=0; c2 &= 0 x0f;/过失判断Ri = c1*16+c2;/拼装为一字节数据return k; /返回解码是否成功的信息main ( )int f; /解码成功标志TRANS ( ) ; /对原始数据进展汉明编码(模拟发送)f = RECEV ( ); /对没有干扰的数据进展解码(模拟接收),f=1,成功.D5 = 0 x20 ; /在接收数据中制造一比特过失f = RECEV ( ); /对有

8、干扰的数据进展解码(模拟接收),f=1,成功.D8 = 0 x24 ; /在接收数据中制造两比特过失f = RECEV ( ); /对有干扰的数据进展解码(模拟接收),f=0,失败.while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /仪器系数自动标定算法。/标定的结果:/系数: COEFF33=4.287,-2.185,-0.1945,/-0.3181,10.56,-0.2134,/-0.3802,-0.1864,0.3893 /本底: cps03=0.2782,0.1101,0.6737float former53=137.4,9.61,0.59,5.05,2

9、84.3,0.37,2.43,8.42,5.71,118.9,270.9,3.05,2.89,7.3,0.9; /五个模型的含量数据float cps53=35.396,2.828,37.787,17.154,28.164,31.537,2.236,1.313,17.828,45.424,28.446,66.166,1.543,0.919,4.608; /五个模型的测量数据float coef33;/9个小写字母系数中间数据float COEFF33;/9个大写字母系数待标定float cps03;/3个本底计数率待标定float A33 ; /存放一次方程组的系数矩阵float B3; /存

10、放一次方程组的常数项float X3; /存放一次方程组的解:X1=1.537067,X2=-0.896159,X3=3.592657float DETA ( ) /行列式计算return (A00*A11*A22+A10*A21*A02+A20*A01*A12-A20*A11*A02-A00*A21*A12-A10*A01*A22); void swap (int k)/常数项与k列系数交换int i;float t;for (i=0;i3;i+) t=Bi;Bi=Aik;Aik=t; void XYZ ( ) /求解一次方程组float d;d=DETA( ); /求系数行列式的值swap

11、 (0) ; /将x1的系数与常数项交换X0=DETA()/d; /解出x1swap (0) ; /恢复原来的系数与常数项swap (1) ; /将x2的系数与常数项交换X1=DETA()/d; /解出x2swap (1) ; /恢复原来的系数与常数项swap (2) ; /将x3的系数与常数项交换X2=DETA()/d; /解出x3swap (2) ; /恢复原来的系数与常数项void RTK (int k) /求解第k行的3个小写字母系数int i,j;for (i=0;i3;i+) /准备方程组的系数for (j=0;j3;j+) Aij=formerij;for (i=0;i3;i+)

12、 Bi=cpsik-cps0k;/准备方程组的常数项XYZ (); /解出3个小写字母系数for (i=0;i3;i+) coefki=Xi;/保存3个小写字母系数void conv ( ) /将9个小写字母系数转换成9个大写字母系数float d;int i,j;for (i=0;i3;i+) /取9个小写字母系数 for (j=0;j3;j+) Aij=coefij;d=DETA( ); /求系数行列式的值COEFF00=(A11*A22-A21*A12)/d;/计算9个大写字母系数COEFF01=(A21*A02-A01*A22)/d;COEFF02=(A01*A12-A02*A11)/

13、d;COEFF10=(A12*A20-A10*A22)/d;COEFF11=(A00*A22-A20*A02)/d;COEFF12=(A10*A02-A00*A12)/d;COEFF20=(A10*A21-A11*A20)/d;COEFF21=(A01*A20-A00*A21)/d;COEFF22=(A00*A11-A01*A10)/d;main ( )int i,j,k=1;float c;for (i=0;i3;i+) cps0i=0; /3个本底计数率初始化为0。for (i=0;i5;i+) /进展5次迭代运算。for (j=0;j3;j+) RTK (j);/计算9个小写字母系数fo

14、r (j=0;j3;j+) /计算零值模型各道的净计数率Bj=coefj0*former40+coefj1*former41+coefj2*former42;for (j=0;j3;j+) cps0j=cps4j-Bj;/计算各道的本底计数率conv ( ); /将9个小写字母系数转换成9个大写字母系数。for (i=0;i3;i+) /计算混合模型各元素的含量Bi=COEFFi0*(cps30-cps00)+COEFFi1*(cps31-cps01)+COEFFi2*(cps32-cps02);c=former30/B0;if ( c1.04 ) k=0;/铀含量误差超过百分之四,标定失败c

15、=former31/B1;if ( c1.06 ) k=0;/钍含量误差超过百分之六,标定失败c=former32/B2;if ( c1.12 ) k=0;/钾含量误差超过百分之十二,标定失败while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /能剔除粗大误差样本的统计算法。#include #define N200/初始样本个数float dN=1.807,1.731,1.813,1.818,1.816,1.721,1.687,1.704,1.678,1.675, /初始样本数据1.828,1.703,1.760,1.798,1.770,1.749,1.757,

16、1.769,1.766,1.771,1.778,1.706,1.739,1.725,1.706,1.786,1.716,1.702,1.806,1.738,1.806,1.722,1.680,1.736,1.824,1.671,1.780,1.668,1.831,1.682,1.733,1.757,1.761,1.778,1.798,1.775,1.727,1.754,1.786,1.801,1.683,1.753,1.714,1.809,1.683,1.656,1.694,1.656,1.736,1.767,1.693,1.779,1.822,1.742,1.744,1.843,1.762,

17、1.732,1.739,1.844,1.720,1.660,1.773,1.841,1.694,1.801,1.854,1.852,1.736,1.747,1.766,1.721,1.710,1.719,1.831,1.648,1.649,1.793,1.746,1.858,1.748,1.770,1.742,1.776,1.793,1.795,1.707,1.763,1.803,1.664,1.761,1.824,1.678,1.691,1.729,1.783,1.631,1.639,1.822,1.754,1.743,1.732,1.714,1.719,1.811,1.766,1.676,

18、1.750,1.847,1.631,1.867,1.753,1.780,1.784,1.694,1.806,1.751,1.821,1.730,1.690,1.750,1.771,1.791,1.870,1.599,1.734,1.778,1.738,1.831,1.889,1.728,1.761,1.764,1.800,1.673,1.896,1.714,1.787,1.792,1.697,1.651,1.762,1.786,1.733,1.803,1.210,1.350,1.110,1.749,2.350,1.748,1.766,1.793,1.788,1.744,1.777,1.728,

19、1.717,1.719,1.760,1.771,1.753,1.711,1.703,1.780,1.711,1.720,1.788,1.833,1.739,1.727,1.765,1.727,1.762,1.780,1.752,1.708,1.699,1.795,1.689,1.806,1.702,1.721,1.744,1.732,1.746,1.792,1.800,1.711,1.769;intn; /当前有效样本个数最终结果为196个float ave; /平均值最终结果为1.7517float s; /方差最终结果为0.0535float averg ( ) /计算平均值int i;f

20、loat sum;for (i=0,sum=0;in;i+) sum += di;return sum/n ;float tjs ( ) /计算方差int i;float sum,c;for (i=0,sum=0;in;i+) c = di-ave ;sum += c*c ;return sqrt(sum/(n-1) ;int del ( ) /剔除坏样本inti,k;float low,high;low = ave - 3*s ; /合理样本的下限high = ave + 3*s ; /合理样本的上限k = 0 ; /初始化剔除标志for (i=0;in;i+) if ( dihigh )

21、/如果发现坏样本if ( in-1 ) /如果该坏样本不是最后一个样本di = dn-1 ; /用最后一个样本来覆盖这个坏样本i- ; /退回前一个位置,以便处理刚刚覆盖的样本n- ; /当前有效样本个数减一k = 1; /设置剔除操作标志return k ;main ( )n=N; /初始样本个数while (1) /数据处理循环ave = averg ( );/计算平均值s = tjs ( ) ; /计算方差if ( !del() ) break;/如果没有剔除坏样本,如此处理完毕while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /线性插值算法。float

22、x0=1.5,y0=2.536; /第一个点的坐标float x1=1.6,y1=3.044; /第二个点的坐标float line (float x) /“点斜式线性插值算法return (y0+(y1-y0)*(x-x0)/(x1-x0); main ( )float x,y;x=1.573;y=line(x); /y=2.90684x=1.532;y=line(x); /y=2.69856while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /抛物线插值算法。float x0=1.5,y0=2.536; /第一个点的坐标float x1=1.6,y1=3.04

23、4; /第二个点的坐标float x2=1.7,y2=3.487; /第三个点的坐标float line1 (float x) /过第一点和第二点的“点斜式线性插值算法return (y0+(y1-y0)*(x-x0)/(x1-x0); float line2 (float x) /过第一点和第三点的“点斜式线性插值算法return (y0+(y2-y0)*(x-x0)/(x2-x0); float qins (float x) /以线性插值算法为根底的抛物线插值算法。return (line1(x)+(line2(x)-line1(x)*(x-x1)/(x2-x1); main ( )flo

24、at x,y;x=1.573;y=qins(x); /y=2.91325x=1.632;y=qins(x); /y=3.19283while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /一次方程组的行列式解法/方程组的形式如下:/ A11*X1+A12*X2+A13*X3=B1/ A21*X1+A22*X2+A23*X3=B2/ A31*X1+A32*X2+A33*X3=B3float A33=3.273,-2.164,0.3582,0.3697,1.534,-6.762,-2.061,7.186,4.508 ; /一次方程组的系数矩阵float B3=8.257,

25、-25.10,6.588; /一次方程组的常数项float X3; /一次方程组的解:X1=1.537067,X2=-0.896159,X3=3.592657float DETA ( ) /行列式计算return (A00*A11*A22+A10*A21*A02+A20*A01*A12-A20*A11*A02-A00*A21*A12-A10*A01*A22); void swap (int k)/常数项与k列系数交换int i;float t;for (i=0;i3;i+) t=Bi;Bi=Aik;Aik=t; void XYZ ( ) /求解一次方程组float d;d=DETA( ); /

26、求系数行列式的值swap (0) ; /将x1的系数与常数项交换X0=DETA()/d; /解出x1swap (0) ; /恢复原来的系数与常数项swap (1) ; /将x2的系数与常数项交换X1=DETA()/d; /解出x2swap (1) ; /恢复原来的系数与常数项swap (2) ; /将x3的系数与常数项交换X2=DETA()/d; /解出x3swap (2) ; /恢复原来的系数与常数项main ( )XYZ () ;while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /解线性方程组的主元消去法有回代过程。/ 5阶线性方程组如下:/ 3x+2y+

27、w-2t=-3/ x- y+2z+3w+5t= 5/ 3y+2w+ t=-6/ -x+ z+ w=-1/ 4x+ y+2z- w- t= 8#define N5 /线性方程组的阶数float ANN+1=3,2,0,1,-2,-3,1,-1,2,3,5,5,0,3,0,2,1,-6,-1,0,1,1,0,-1,4,1,2,-1,-1,8 ; /5阶线性方程组的增广系数矩阵float XN; /5阶线性方程组的解:X=1.0,Y=-1.0,z=2.0,w=-2.0,t=1.0void findmain (int i)/寻找第i列的主元,并将其所在行交换到当前处理行位置上int j,k;float

28、 c;c=Aii;k=i;/初始化主元在第i行for (j=i+1;jc) c=Aji;k=j;if (k!=i) for (j=0;j=N;j+) /将主元所在行交换到当前处理行位置上c=Akj;Akj=Aij;Aij=c;void divmain (int i)/将主元所在行的各个系数除以主元,使主元为1int j;float c;c=Aii;Aii=1.0;for (j=i+1;j=N;j+) Aij/=c;void del (int i) /进展第i列的消元处理int j,k;float c;for (j=i+1;jN;j+) if (Aji) /从i+1行开始进展消元处理c=Aji;

29、Aji=0;for (k=i+1;k=N;k+) Ajk -= c*Aik;main ( )int i,j;for (i=0;iN;i+) /按行处理if (iN-1) findmain (i);/寻找主元,并将其所在行交换到当前处理行位置上divmain (i) ; /将当前处理行的各个系数除以主元,使主元为1if (i=0;i-)/回代过程for (j=N-1;ji;j-) AiN -= Aij*AjN;for (i=0;iN;i+) Xi=AiN; /保存n阶线性方程组的解 while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /解线性方程组的主元消去法无回代

30、过程。/ 5阶线性方程组如下:/ 3x+2y+ w-2t=-3/ x- y+2z+3w+5t= 5/ 3y+2w+ t=-6/ -x+ z+ w=-1/ 4x+ y+2z- w- t= 8#define N5 /线性方程组的阶数float ANN+1=3,2,0,1,-2,-3,1,-1,2,3,5,5,0,3,0,2,1,-6,-1,0,1,1,0,-1,4,1,2,-1,-1,8 ; /5阶线性方程组的增广系数矩阵float XN; /5阶线性方程组的解:X=1.0,Y=-1.0,z=2.0,w=-2.0,t=1.0void findmain (int i)/寻找第i列的主元,并将其所在行

31、交换到当前处理行位置上int j,k;float c;c=Aii;k=i;/初始化主元在第i行for (j=i+1;jc) c=Aji;k=j;/寻找主元所在行if (k!=i) for (j=0;j=N;j+) /将主元所在行交换到当前处理行位置上c=Akj;Akj=Aij;Aij=c;void divmain (int i)/将主元所在行的各个系数除以主元,使主元为1int j;float c;c=Aii;Aii=1.0;for (j=i+1;j=N;j+) Aij/=c;void del (int i) /进展第i列的消元处理int j,k;float c;for (j=0;jN;j+)

32、 if (j!=i & Aji) c=Aji;Aji=0;for (k=i+1;k=N;k+) Ajk -= c*Aik;main ( )int i;for (i=0;iN;i+) /按行处理if (iN-1) findmain (i);/寻找主元,并将其所在行交换到当前处理行位置上divmain (i) ; /将当前处理行的各个系数除以主元,使主元为1del (i); /进展消元处理for (i=0;iN;i+) Xi=AiN; /保存n阶线性方程组的解 while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /图的广度优先遍历算法利用邻接矩阵。/A - H/B -

33、 IG/|/|/|/C - F|/|/|/ |/D - E/#define N9/图的顶点数#define maxsize 16 /定义队列的容量structsequeue int dmaxsize ; /用数组作为队列的储存空间intfront,rear ; /指示队头位置和队尾位置的指针 Q ; /定义一个全程队列变量char DOTN=A,B,C,D,E,F,G,H,I;/存放顶点信息的数组char OUTN+1; /存放被访问顶点信息顺序的数组,OUT0保存已访问顶点总数char visitedN; /存放顶点被访问标志/邻接矩阵:int GRANN =0,1,0,0,0,0,0,1,

34、0,1,0,1,0,0,0,0,0,1, 0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,1,0;int ENQUEUE ( int x ) /数据入队算法 if ( Q.front = (Q.rear+1) % maxsize ) return 0; /队列否已满,入队失败 else Q.rear = (Q.rear+1) % maxsize ; /调整队尾指针Q.dQ.rear = x ;/数据成

35、功入队return 1 ; void BFS (int k)/从顶点i出发,广度优先搜索遍历连通图int i,j; /定义辅助变量Q.front = Q.rear = maxsize -1; /初始化空队OUT +OUT0 = DOTk;/先访问该顶点输出该顶点信息visitedk = 1 ; /作已访问标记ENQUEUE (k); /将访问过的出发顶点入队while ( Q.front != Q.rear) /只要队列不空Q.front = ( Q.front+1) % maxsize ; /调整队首指针i = Q.dQ.front ;/队首顶点出队for (j=0;jN;j+)/访问它的所

36、有邻接顶点if ( GRAij = 1 & !visitedj ) /如果该顶点邻接且未访问OUT +OUT0 = DOTj;/访问该顶点输出该顶点信息visitedj = 1; /作已访问标志ENQUEUE (j); /将访问过的顶点入队/出发点序号为0时的遍历顺序:ABHCIGDFE/出发点序号为1时的遍历顺序:BACIHDFGE/出发点序号为2时的遍历顺序:CBDFAIEGH/出发点序号为3时的遍历顺序:DCEBFGAIH/出发点序号为4时的遍历顺序:EDFGCIHBA/出发点序号为5时的遍历顺序:FCEGIBDHA/出发点序号为6时的遍历顺序:GEFHDCIAB/出发点序号为7时的遍历

37、顺序:HAGIBEFCD/出发点序号为8时的遍历顺序:IBFHACEGDmain ( )inti,j;for (i=0;iN;i+) OUT0=0; /初始化已访问顶点数for (j=0;jN;j+) visitedj=0;/初始化访问标志BFS (i) ; /从序号为i的顶点出发进展广度优先遍历while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /图的广度优先遍历算法利用邻接表。/A - H/B - IG/|/|/|/C - F|/|/|/ |/D - E/#define N9/图的顶点数#define M4/图的度数#define maxsize 16 /定义

38、队列的容量structsequeue int dmaxsize ; /用数组作为队列的储存空间intfront,rear ; /指示队头位置和队尾位置的指针 Q ; /定义一个全程队列变量char DOTN=A,B,C,D,E,F,G,H,I;/存放顶点信息的数组char OUTN+1; /存放被访问顶点信息顺序的数组,OUT0保存已访问顶点总数char visitedN; /存放顶点被访问标志/邻接表:int GRANM+1 =1,7,-1,-1,-1,0,2,8,-1,-1,1,3,5,-1,-1,2,4,-1,-1,-1,3,5,6,-1,-1,2,4,6,8,-1,4,5,7,-1,-

39、1,0,6,8,-1,-1,1,5,7,-1,-1;int ENQUEUE ( int x ) /数据入队算法 if ( Q.front = (Q.rear+1) % maxsize ) return 0; /队列否已满,入队失败 else Q.rear = (Q.rear+1) % maxsize ; /调整队尾指针Q.dQ.rear = x ;/数据成功入队return 1 ; void BFSL (int k)/从顶点i出发,广度优先搜索遍历连通图int i,j; /定义辅助变量Q.front = Q.rear = maxsize -1; /初始化空队OUT +OUT0 = DOTk;/

40、先访问该顶点输出该顶点信息visitedk = 1 ; /作已访问标记ENQUEUE (k); /将访问过的出发顶点入队while ( Q.front != Q.rear) /只要队列不空Q.front = ( Q.front+1) % maxsize ; /调整队首指针i = Q.dQ.front ; /队首顶点出队for (j=0;j=M;j+) /顺序访问它的所有邻接顶点k=GRAij; /读取顶点序号if (k=-1) break;/如果该顶点的邻接顶点处理完毕if ( !visitedk ) /如果该顶点尚未访问OUT +OUT0 = DOTk; /访问该顶点输出该顶点信息visit

41、edk = 1; /作已访问标志ENQUEUE (k); /将访问过的顶点入队/出发点序号为0时的遍历顺序:ABHCIGDFE/出发点序号为1时的遍历顺序:BACIHDFGE/出发点序号为2时的遍历顺序:CBDFAIEGH/出发点序号为3时的遍历顺序:DCEBFGAIH/出发点序号为4时的遍历顺序:EDFGCIHBA/出发点序号为5时的遍历顺序:FCEGIBDHA/出发点序号为6时的遍历顺序:GEFHDCIAB/出发点序号为7时的遍历顺序:HAGIBEFCD/出发点序号为8时的遍历顺序:IBFHACEGDmain ( )inti,j;for (i=0;iN;i+) OUT0=0; /初始化已访

42、问顶点数for (j=0;jN;j+) visitedj=0;/初始化访问标志BFSL (i) ; /从序号为i的顶点出发进展广度优先遍历while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /图的深度优先遍历算法利用邻接矩阵。/A - H/B - IG/|/|/|/C - F|/|/|/ |/D - E/#define N9/图的顶点数char DOTN=A,B,C,D,E,F,G,H,I;/存放顶点信息的数组char OUTN+1; /存放被访问顶点信息顺序的数组,OUT0保存已访问顶点总数char visitedN; /存放顶点被访问标志/邻接矩阵:int G

43、RANN =0,1,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,1,0;void DFS (int i)reentrant /从顶点i出发,深度优先搜索遍历连通图 int j;OUT +OUT0 = DOTi;/先访问该顶点输出该顶点信息visitedi = 1 ; /作已访问标记for (j=0;jN;j+) /从顶点i出发,扫描所

44、有相邻顶点if ( GRAij = 1 & !visitedj ) /如果未访问过DFS (j) ; /从顶点j出发,按深度优先继续搜索/出发点序号为0时的遍历顺序:ABCDEFGHI/出发点序号为1时的遍历顺序:BAHGEDCFI/出发点序号为2时的遍历顺序:CBAHGEDFI/出发点序号为3时的遍历顺序:DCBAHGEFI/出发点序号为4时的遍历顺序:EDCBAHGFI/出发点序号为5时的遍历顺序:FCBAHGEDI/出发点序号为6时的遍历顺序:GEDBCAHIF/出发点序号为7时的遍历顺序:HABCDEFGI/出发点序号为8时的遍历顺序:IBAHGEDCFmain ( )inti,j;f

45、or (i=0;iN;i+) OUT0=0; /初始化已访问顶点数for (j=0;jN;j+) visitedj=0;/初始化访问标志DFS (i) ; /从序号为i的顶点出发进展深度优先遍历while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /图的深度优先遍历算法利用邻接表。/A - H/B - IG/|/|/|/C - F|/|/|/ |/D - E/#define N9/图的顶点数#define M4/图的度数char DOTN=A,B,C,D,E,F,G,H,I;/存放顶点信息的数组char OUTN+1; /存放被访问顶点信息顺序的数组,OUT0保存已

46、访问顶点总数char visitedN; /存放顶点被访问标志/邻接表:int GRANM+1 =1,7,-1,-1,-1,0,2,8,-1,-1,1,3,5,-1,-1,2,4,-1,-1,-1,3,5,6,-1,-1,2,4,6,8,-1,4,5,7,-1,-1,0,6,8,-1,-1,1,5,7,-1,-1;void DFSL (int i)reentrant /从顶点i出发,深度优先搜索遍历连通图 int j,k;OUT +OUT0 = DOTi;/先访问该顶点输出该顶点信息visitedi = 1 ; /作已访问标记for (j=0;j=M;j+) /从顶点i出发,扫描所有相邻顶点k

47、=GRAij; /读取顶点序号if (k=-1) break;/如果该顶点的邻接顶点处理完毕if ( !visitedk ) DFSL (k) ; /如果未访问过,从顶点j出发按深度优先继续搜索/出发点序号为0时的遍历顺序:ABCDEFGHI/出发点序号为1时的遍历顺序:BAHGEDCFI/出发点序号为2时的遍历顺序:CBAHGEDFI/出发点序号为3时的遍历顺序:DCBAHGEFI/出发点序号为4时的遍历顺序:EDCBAHGFI/出发点序号为5时的遍历顺序:FCBAHGEDI/出发点序号为6时的遍历顺序:GEDBCAHIF/出发点序号为7时的遍历顺序:HABCDEFGI/出发点序号为8时的遍

48、历顺序:IBAHGEDCFmain ( )inti,j;for (i=0;iN;i+) OUT0=0; /初始化已访问顶点数for (j=0;jN;j+) visitedj=0;/初始化访问标志DFSL (i) ; /从序号为i的顶点出发进展深度优先遍历while (1) ; /在这一行设置断点,中止程序运行,以便观察程序运行的结果 /网络中顶点间最短距离算法利用邻接矩阵。/网络结构:/A/ | /4 /| 7/|/B6|C/| 9|8 / |/|/|/| | /|/8|D|5/|/ | 3| /|5/| /| /| | /E4|F /|/|/2|/ 9/G/从节点A出发的最短距离与路径:/A

49、/ | /4 /| 7/|/B=46|C=7/|/|/|/D=6/ | 3/5/|/|/E=114|F=9/|/|/|/G=10/从节点B出发的最短距离与路径:/A=4/4 / 7/BC=11/| 9/|/|/8|D=9/| 3/|/|/E=8F=12/2/G=10/从节点C出发的最短距离与路径:/A=7/4 / 7/B=11C/8 / |/|/|/D=8|5/ | /5/| /| /E=134|F=5 /|/|/|/G=12/从节点D出发的最短距离与路径:/A=6/|/|/|/B=96|C=8/ 9|8 /|/ | /D/ | 3/5/|/|/E=54|F=3/|/|/|/G=4/从节点E出

50、发的最短距离与路径:/A=11/|/|/|/B=86|C=13/|8 /|/| /8|D=5/|/ 3/|5/| /EF=8/2/G=2/从节点F出发的最短距离与路径:/A=9/|/|/|/B=126|C=5/ 9|/|/ |/D=3|5/ | 3| /5/| /| | /E=84|F /|/|/|/G=7/从节点G出发的最短距离与路径:/A=10/|/|/|/B=106|C=12/|8 /|/| /8|D=4/| 3/|/|/E=24|F=7/|/|/2|/G/#define N7/图的顶点数#define MAX 9999/一个远大于距离的数char DOTN=A,B,C,D,E,F,G;/存放顶点信息的数组char visitedN; /存放顶点被访问标志intlenN; /距离数组charFN; /父节点/网络的邻接矩阵MAX表示不相邻:int NETNN =0,4,7,6,MAX,MAX,MAX,4,0,MAX,9,8,MAX,MAX,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论