主题:急!三元组的转置问题
请大家棒棒手,我是刚刚学习数据结构的,如今学到稀疏矩阵的三元组,自己编写了个实现三元组的程序,发现好多错误,自己的英文水平不太好,该起来有困难,望大家棒棒忙(其中的算法是书本上的,但我发现这本书的源代码有误,难免下面有许多错误)。希望大家不吝赐教。谢谢!
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct
{
int r;
int c;
ElemType d;
}Mat;
typedef struct
{
int rows;
int cols;
int nums;
Mat data[MAXSIZE];
}Spmatrix;
Spmatrix a1,b1;
int M=5;
int N=5;
void CreatMat(Spmatrix *f,ElemType A[M][N]);
void Fasttran(Spmatrix a,Spmatrix *b);
void OutMat(Spmatrix f);
void main()
{
int cord;
int array[5][5]={{0,2,0,0,5},{0,0,0,6,0},{1,0,0,6,0},{0,7,0,0,3},{8,0,0,4,6}};
do{
printf("原二维矩阵如下:");
for(int i=0;i<5;i++)
{
printf("\n");
for(int j=0;j<5;j++)
printf("2%d",array[i][j]);
}
printf("\n 主菜单:\n");
printf("\n 1 建立三元组顺序表 \n");
printf("\n 2 三元组转置 \n");
printf("\n 3 结束程序 \n");
printf("----------------------------------\n");
printf("请输入选择(1,2,3)");scanf("%d",&cord);
switch(cord)
{
case 1:{
void CreatMat(&a1,array[5][5]);
void OutMat(a1);
}break;
case 2:{
void Fasttran(a1,&b1);
void OutMat(&b1);
}break;
case 3:exit(0);
}
}while(cord<=3);
}
/*创建三元组*/
void CreatMat(Spmatrix *f,ElemType A[M][N])
{
int i,j;
f->rows=M;
f->cols=N;
f->nums=0;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
if(A[i][j]!=0)
{
f->data[f->nums].r=i;
f->data[f->nums].c=j;
f->data[f->nums].d=A[i][j];
f->nums++;
}
}
}
/*三元组转置(行列转置)*/
void fasttran(Spmatrix a,Spmatrix *b)
{
int col;
int p;
int q;
b->rows=a.cols;
b->cols=a.rows;
b->nums=a.nums;
if(a.nums!=0)
{
for(col=1;col<=a.cols;col++) num[col]=0;
for(int k=0;k<a.nums;k++) num[a.data[k].c++];
int pot[1]=0;
for(col=2;col<=a.nums;k++)pot[col]=pot[col-1]+num[col-1];
for(p=0;p<a.nums;p++)
{
col=a.data[p].c;
q=pot[col];
b->data[q].r=a.data[p].c;
b->data[q].c=a.data[p].r;
b->data[q].d=a.data[p].d;
pot[col]++;
}
}
}
/*三元组的输出*/
void OutMat(Spmatrix f)
{
int i;
if(f.nums<=0) return;
printf("\t%d\t%d\t%d\n",f.rows,f.cols,f.nums);
printf("------------------\n");
for(i=0;i<f.nums;i++)
printf("\t%d\t%d\t%d\n",f.data[i].r,f.data[i].c,f.data[i].d);
}
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct
{
int r;
int c;
ElemType d;
}Mat;
typedef struct
{
int rows;
int cols;
int nums;
Mat data[MAXSIZE];
}Spmatrix;
Spmatrix a1,b1;
int M=5;
int N=5;
void CreatMat(Spmatrix *f,ElemType A[M][N]);
void Fasttran(Spmatrix a,Spmatrix *b);
void OutMat(Spmatrix f);
void main()
{
int cord;
int array[5][5]={{0,2,0,0,5},{0,0,0,6,0},{1,0,0,6,0},{0,7,0,0,3},{8,0,0,4,6}};
do{
printf("原二维矩阵如下:");
for(int i=0;i<5;i++)
{
printf("\n");
for(int j=0;j<5;j++)
printf("2%d",array[i][j]);
}
printf("\n 主菜单:\n");
printf("\n 1 建立三元组顺序表 \n");
printf("\n 2 三元组转置 \n");
printf("\n 3 结束程序 \n");
printf("----------------------------------\n");
printf("请输入选择(1,2,3)");scanf("%d",&cord);
switch(cord)
{
case 1:{
void CreatMat(&a1,array[5][5]);
void OutMat(a1);
}break;
case 2:{
void Fasttran(a1,&b1);
void OutMat(&b1);
}break;
case 3:exit(0);
}
}while(cord<=3);
}
/*创建三元组*/
void CreatMat(Spmatrix *f,ElemType A[M][N])
{
int i,j;
f->rows=M;
f->cols=N;
f->nums=0;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
if(A[i][j]!=0)
{
f->data[f->nums].r=i;
f->data[f->nums].c=j;
f->data[f->nums].d=A[i][j];
f->nums++;
}
}
}
/*三元组转置(行列转置)*/
void fasttran(Spmatrix a,Spmatrix *b)
{
int col;
int p;
int q;
b->rows=a.cols;
b->cols=a.rows;
b->nums=a.nums;
if(a.nums!=0)
{
for(col=1;col<=a.cols;col++) num[col]=0;
for(int k=0;k<a.nums;k++) num[a.data[k].c++];
int pot[1]=0;
for(col=2;col<=a.nums;k++)pot[col]=pot[col-1]+num[col-1];
for(p=0;p<a.nums;p++)
{
col=a.data[p].c;
q=pot[col];
b->data[q].r=a.data[p].c;
b->data[q].c=a.data[p].r;
b->data[q].d=a.data[p].d;
pot[col]++;
}
}
}
/*三元组的输出*/
void OutMat(Spmatrix f)
{
int i;
if(f.nums<=0) return;
printf("\t%d\t%d\t%d\n",f.rows,f.cols,f.nums);
printf("------------------\n");
for(i=0;i<f.nums;i++)
printf("\t%d\t%d\t%d\n",f.data[i].r,f.data[i].c,f.data[i].d);
}