以矩阵连乘为例:
#include"stdio.h"
#define Arr_Len 7
void Print(int **s,int i,int j);
void My_MatrixChain(int *p,int n,int **m,int **s)
{
int i,k;
for(i=0;i<=n;i++)
{
*((int *)(m+i*Arr_Len)+i)=0;
}
int r;
for(r=2;r<=n;r++)
{
for(i=1;i<=n-r+1;i++)
{
int j=i+r-1;
*(((int *)(m+i*Arr_Len))+j)=*(((int *)(m+(i+1)*Arr_Len))+j)+p[i-1]*p[i]*p[j];
*(((int *)(s+i*Arr_Len))+j)=i;
int q;
for(q=i+1;q
{
int temp=*(((int *)(m+i*Arr_Len))+q)+(*(((int *)(m+(q+1)*Arr_Len))+j))+p[i-1]*p[q]*p[j];
if(temp<(*(((int *)(m+i*Arr_Len))+j)))
{
*(((int *)(m+i*Arr_Len))+j)=temp;
*(((int *)(s+i*Arr_Len))+j)=q;
}
}
}
}
/*int l;
for(i=1;i<=n;i++)
{
for(l=1;l<=n;l++)
{
printf("%d\t",*(((int *)(m+i*Arr_Len))+l));
}
printf("\n");
} */
}
void My_Traceback(int i,int j,int **s)
{
if(i==j)
{
printf("A%d",i);
return;
}
printf("(");
My_Traceback(i,*(((int *)(s+i*Arr_Len))+j),s);
My_Traceback((*(((int *)(s+i*Arr_Len))+j))+1,j,s);
printf(")");
}
int main()
{
int a[Arr_Len]={30,35,15,5,10,20,25};
int mm[7][7]={0};
int ss[7][7]={0};
int i,l;
My_MatrixChain(a,6,(int **)mm,(int **)ss);
printf("(A1-A6)最少计算次数:%d\n",mm[1][6]);
printf("按断点输出:\n");
My_Traceback(1,6,(int **)ss);
printf("\n");
return 0;
}
传递的参数为二维指针,不能用m[i][j],编译器不能正确的进行寻址。可以用另外一种方式,因为二维指针是一个指向指针的指针所以可以采用下面一种方式,*((int*)m+i*n+j),其实参数传递的时候也可以直接采用m[][10]的方式进行传递,第二维的数一定不能省略而且还必须要和传递的实参相对应。
阅读(1415) | 评论(0) | 转发(0) |