- // algo5-1.cpp 实现算法5.2的程序
- #include"c1.h"
- typedef int ElemType;
- #include"c5-2.h"
- #include"bo5-2.cpp"
- void FastTransposeSMatrix(TSMatrix M,TSMatrix &T)
- { // 快速求稀疏矩阵M的转置矩阵T。算法5.2改
- int p,q,t,col,*num,*cpot;
- num=(int *)malloc((M.nu+1)*sizeof(int)); // 存M每列(T每行)非零元素个数([0]不用)
- cpot=(int *)malloc((M.nu+1)*sizeof(int)); // 存T每行的下1个非零元素的存储位置([0]不用)
- T.mu=M.nu; // 给T的行、列数与非零元素个数赋值
- T.nu=M.mu;
- T.tu=M.tu;
- if(T.tu) // 是非零矩阵
- {
- for(col=1;col<=M.nu;++col)
- num[col]=0; // 计数器初值设为0
- for(t=1;t<=M.tu;++t) // 求M中每一列含非零元素个数
- ++num[M.data[t].j];
- cpot[1]=1; // T的第1行的第1个非零元在T.data中的序号为1
- for(col=2;col<=M.nu;++col)
- cpot[col]=cpot[col-1]+num[col-1]; // 求T的第col行的第1个非零元在T.data中的序号
- for(p=1;p<=M.tu;++p) // 从M的第1个元素开始
- {
- col=M.data[p].j; // 求得在M中的列数
- q=cpot[col]; // q指示M当前的元素在T中的序号
- T.data[q].i=M.data[p].j;
- T.data[q].j=M.data[p].i;
- T.data[q].e=M.data[p].e;
- ++cpot[col]; // T第col行的下1个非零元在T.data中的序号
- }
- }
- free(num);
- free(cpot);
- }
- void main()
- {
- TSMatrix A,B;
- printf("创建矩阵A: ");
- CreateSMatrix(A);
- PrintSMatrix1(A);
- FastTransposeSMatrix(A,B);
- printf("矩阵B(A的快速转置):/n");
- PrintSMatrix1(B);
- }
- // algo5-2.cpp 变长参数表(函数的实参个数可变)编程示例
- #include"c1.h"
- #include<stdarg.h> // 实现变长参数表要包括的头文件
- typedef int ElemType;
- ElemType Max(int num,...) // ...表示变长参数表,位于形参表的最后,前面必须有至少一个固定参数
- { // 函数功能:返回num个数中的最大值
- va_list ap; // 定义ap是变长参数表类型(C语言的数据类型)
- int i;
- ElemType m,n;
- if(num<1)
- exit(ERROR);
- va_start(ap,num); // ap指向固定参数num后面的实参表
- m=va_arg(ap,ElemType); // 依次读取ap所指的实参(以逗号为分隔符)作为ElemType类型实参,ap向后移
- for(i=1;i<num;++i)
- {
- n=va_arg(ap,ElemType); // 同上
- if(m<n)
- m=n;
- }
- va_end(ap); // 与va_start()配对,结束对变长参数表的读取,ap不再指向变长参数表
- return m;
- }
- void main()
- {
- printf("1.最大值为%d/n",Max(4,7,9,5,8)); // 在4个数中求最大值,ap最初指向“7,9,5,8”
- printf("2.最大值为%d/n",Max(3,17,36,25)); // 在3个数中求最大值,ap最初指向“17,36,25”
- }