数据结构课程设计稀疏矩阵转置源程序代码

#include
#define MAXSIZE 100 /* 非零元个数的最大值 */
typedef struct triple
{
int i,j; /* 行下标,列下标 */
int e; /* 非零元素值 */
}triple;
typedef struct tsmatrix
{
triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用 */
int mu,nu,tu; /* 矩阵的行数、列数和非零元个数 */
/* 各列第一个非零元的位置表rpos[0]未用 */
}rlsmatrix;
createsmatrix(rlsmatrix *M)
{ /* 创建稀疏矩阵M */
int e,i,m,n;
M->data[0].i=0; /* 为以下比较顺序做准备 */
printf("请输入矩阵的行数,列数,和非零元素的个数:");
scanf("%d",&M->mu);scanf("%d",&M->nu);scanf("%d",&M->tu);
for(i=1;i<=M->tu;i++)
{
printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:",i,M->mu,M->nu);
scanf("%d",&m);scanf("%d",&n);scanf("%d",&e);
if(m<1||m>M->mu||n<1||n>M->nu) /*行或列超出范围 */
{printf("行或列超出范围");getch();exit();}
if(mdata[i-1].i||m==M->data[i-1].i&&n<=M->data[i-1].j) /*行或列的顺序有错*/
{printf("行或列的顺序有错");getch();exit();}
M->data[i].i=m;
M->data[i].j=n;
M->data[i].e=e;
}
}
void transposesmatrix(rlsmatrix M,rlsmatrix *T)
{ /* cpos存放每列的第一个非零元素的地址,temp中间变量 */
int i,m,*cpos,*temp,k=0;
T->mu=M.nu;
T->nu=M.mu;
T->tu=M.tu;
cpos=(int *)malloc(M.mu*sizeof(int));
if(cpos==NULL)exit();
temp=(int *)malloc(M.mu*sizeof(int));
if(temp==NULL)exit();
/* 对cpos对初始化,初值为0 */
*(cpos+1)=0;
for(i=1;i<=M.nu;i++)
{
for(m=1;m<=M.tu;m++)
{
if(M.data[m].j==i)
k++;
}
temp[i]=k;
if(i==1&&k!=0)
*(cpos+i)=1;/* 为cpos赋值 */
if(i>1)
*(cpos+i)=*(temp+i-1)+1;
}
free(temp);
for(i=1;i<=M.tu;i++)/* 进行转置 */
{T->data[*(cpos+M.data[i].j)].i=M.data[i].j;
T->data[*(cpos+M.data[i].j)].j=M.data[i].i;
T->data[*(cpos+M.data[i].j)].e=M.data[i].e;
(*(cpos+M.data[i].j))++;}
free(cpos);
}

main()
{
RLSMatrix M,N,Q;
char ch;
printf(" *************************** \n");
printf(" ** ** \n");
printf(" ** 稀疏矩阵运算器 ** \n");
printf(" ** --------------------- ** \n");
printf(" *************************** \n");
printf(" _____________________________________________________________________ \n");
printf(" | 请选择 | \n");
printf(" | A.转置 Y.继续运算 N.结束运算 | \n");
printf(" |_____________________________________________________________________| \n\n");
printf("\2 输入数字时请用逗号隔开!\n\n");
printf(" ->");
scanf("%c",&ch);
while(ch!='N'){

//进行循环运算
switch(ch){//进行运算选择


case'A':{printf("请输入要转置的矩阵:\n\n");
ScanRLSMatrix(&M);
printf(" 输入的要转置的矩阵为:\n\n");
PrintRLSMatrix(M);
FasttransposeRLSMatrix(M,&Q);
printf("转置矩阵为:\n\n");
PrintRLSMatrix(Q);
printf("是否继续运算(Y/N)?\n\n");
printf(" ->");
ch=getchar();
}break;

case'Y':{printf("请选择运算\n");
printf(" ->");
ch=getchar();
}break;
default:printf("->");ch=getchar();break;
}
}
printf(" 运算结束!\n\n");
printf(" \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1谢谢使用!\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\n\n");
getch();
}




















相关文档
最新文档