每次调用完转置函数后,程序就会被强行截停。
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef int elemtype;
typedef struct
{
int row,col;
elemtype e;
}triple;
typedef struct
{
triple data[maxsize];
int r,c,len;
}tsmatrix;
int A[6][6]={{0,12,9,0,0,0},{0,0,0,0,0,0},{-3,0,0,0,0,14},{0,0,24,0,0,0},{0,18,0,0,0,0},{15,0,0,-7,0,0}};
void CreateTriple(tsmatrix s)
{
int i,j;
s.r=6;
s.c=6;
s.len=0;
for (i=0;i<6;i++)
{
for (j=0;j<6;j++)
{
if (A[i][j]!=0)
{
s.data[s.len].row=i;
s.data[s.len].col=j;
s.data[s.len].e=A[i][j];
s.len++;
}
}
}
}
void PrintTriple(tsmatrix s)
{
int i;
if (s.len<= 0)
printf("三元组表为空!!!\n");
else
{
printf("三元组表如下:\n");
printf("\t%d\t%d\t%d\n",s.r,s.c,s.len);
printf("\t===========================\n");
for (i=0;i<s.len;i++)
printf("\t%d\t%d\t%d\n",s.data[i].row,s.data[i].col,s.data[i].e);
}
}
void SumTriple(tsmatrix s)
{
int sum=0;
for (int i=0;i<s.len;i++)
{
if (s.data[i].row == s.data[i].col)
sum+=s.data[i].e;
}
printf("对角线之和为:%d\n",sum);
}
void TransposeTriple(tsmatrix s,tsmatrix p)
{
int cols,t,m,n;
int num[maxsize],pos[maxsize];;
p.len=s.len;
p.r=s.c;
p.c=s.r;
if(p.len)
{
for(cols=1;cols<=s.c;cols++)
num[cols]=0;
for(t=1;t<=s.len;t++)
num[s.data[t].col]++;
pos[1]=1;
for(cols=2;cols<=s.c;cols++)
pos[cols]=pos[cols-1]+num[cols-1];
for(m=1;m<=s.len;m++)
{
cols=s.data[m].col;
n=pos[cols];
p.data[n].row=s.data[m].col;
p.data[n].col=s.data[m].row;
p.data[n].e=s.data[m].e;
pos[cols]++;
}
printf("转置成功!!!\n");
}
}
int main()
{
int opt,i,j;
tsmatrix s,p;
printf("稀疏矩阵如下:\n");
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
printf("%-5d",A[i][j]);
printf("\n");
}
while(1)
{
printf(" |*==============================*| \n");
printf(" |* 稀疏矩阵三元组表 *| \n");
printf(" |*==============================*| \n");
printf(" |* 1.创建三元组表 *| \n");
printf(" |* 2.显示三元组表 *| \n");
printf(" |* 3.对角线元素和 *| \n");
printf(" |* 4.转置三元组表 *| \n");
printf(" |* 0.退出当前系统 *| \n");
printf(" |*==============================*| \n");
printf(" |* 注:按要求输入菜单号 *| \n");
printf(" |*==============================*| \n");
printf(" 请输入要进行的功能编码(0~4):");
scanf("%d",&opt);
getchar();
switch(opt)
{
case 1:
CreateTriple(s);
printf("创建成功!!!\n");
break;
case 2:
PrintTriple(s);
break;
case 3:
SumTriple(s);
break;
case 4:
TransposeTriple(s,p);
PrintTriple(p);
break;
case 0:system("cls");exit(0);break;
default:printf("数据错误!请输入0~4之间的整数!\n");break;
}
}
}