題目
以三元組的形式給出輸入數(shù)據(jù),選擇對應(yīng)的運(yùn)算后給出對應(yīng)輸出結(jié)果(稀疏矩陣的運(yùn)算器)
思路
頁面布局就不說了,這里大概說一下各個(gè)運(yùn)算模塊的實(shí)現(xiàn)
加減法
將三元組中對應(yīng)的元素行列位置進(jìn)行比較,將較為靠前的元素直接放進(jìn)新的三元組存儲(chǔ)結(jié)構(gòu),位置相同的元素通過對應(yīng)符號(hào)判斷是加法還是減法,運(yùn)算后放入新的三元組存儲(chǔ)結(jié)構(gòu),最后輸出即可,具體結(jié)合代碼
乘法
根據(jù)輸入的兩個(gè)矩陣,對結(jié)果矩陣的行數(shù)和列數(shù)進(jìn)行初始化,然后分別求結(jié)果矩陣的每一個(gè)元素,如果為非零元素,將其加入三元組存儲(chǔ)結(jié)構(gòu),具體結(jié)合代碼
轉(zhuǎn)置
使用num1數(shù)組記錄每一列的元素?cái)?shù)量,用pos數(shù)組記錄結(jié)果矩陣中每一行的第一個(gè)非零元素的位置,然后遍歷需要計(jì)算的矩陣的非零元素,放入對應(yīng)位置即可,每次放入后需要將pos數(shù)組中對應(yīng)位置加一,因?yàn)榇颂幰呀?jīng)放元素了,下一次就應(yīng)該放在下一個(gè)位置(所以pos[i]數(shù)組實(shí)際上表示的是原矩陣對應(yīng)列為i的元素應(yīng)該放在結(jié)果矩陣中的位置)。具體結(jié)合代碼。
測試數(shù)據(jù)
加法
輸入
1
3 3
2
1 1 1
1 2 2
2
1 1 2
1 3 3
結(jié)果
乘法
輸入
3
3 5
5 3
4
1 1 4
1 2 -3
2 4 8
3 3 1
5
1 1 3
2 1 4
2 3 -1
3 2 1
4 1 1
結(jié)果
轉(zhuǎn)置
輸入文章來源:http://www.zghlxwxcb.cn/news/detail-510090.html
4
4 4
3
1 1 2
1 2 3
3 2 3
結(jié)果文章來源地址http://www.zghlxwxcb.cn/news/detail-510090.html
代碼
#include<stdio.h>
#define MAXSIZE 10000
typedef struct {
int row;
int col;
double value;
}Triple;
typedef struct {
Triple data[MAXSIZE+1];
int rows,cols,nums; //行數(shù),列數(shù),非零元素個(gè)數(shù)
}TSMatrix;
void init(TSMatrix *p,int m,int n); //初始化
void input(TSMatrix *p,int num); //輸入
void compute(TSMatrix *p1,TSMatrix *p2,TSMatrix *p3,char c); //計(jì)算
void mulCompute(TSMatrix *p1,TSMatrix *p2,TSMatrix *p3); //乘法
double get(TSMatrix *p,int m,int n);//獲取三元組p中存儲(chǔ)中處于m行n列的元素值
void transpose(TSMatrix *p,TSMatrix *p3); //稀疏矩陣的轉(zhuǎn)置
int main()
{
TSMatrix x1,x2,x3;
while(1){
printf("1--加\n2--減\n3-乘\n4--轉(zhuǎn)置\n5--退出\n請輸入計(jì)算方式:");
int choice;
scanf("%d",&choice);
switch(choice){
case 1:
compute(&x1,&x2,&x3,'+');
break;
case 2:
compute(&x1,&x2,&x3,'-');
break;
case 3:
mulCompute(&x1,&x2,&x3);
break;
case 4:
transpose(&x1,&x3);
}
if(choice==5){
break;
}
printf("結(jié)果為(三元組形式---行 列 值):\n");
for(int i=1;i<=x3.nums;i++){
printf("%4d %4d %4.0lf\n",x3.data[i].row,x3.data[i].col,x3.data[i].value);
}
printf("矩陣形式為:\n");
int cnt1=1;
for(int i=1;i<=x3.rows;i++){
for(int j=1;j<=x3.cols;j++){
printf("%4.0lf",cnt1<=x3.nums&&i==x3.data[cnt1].row&&j==x3.data[cnt1].col?x3.data[cnt1++].value:0);
}
printf("\n");
}
}
}
//初始化
void init(TSMatrix *p,int m,int n)
{
p->rows=m;
p->cols=n;
p->nums=0;
}
//輸入
void input(TSMatrix *p,int num)
{
int cnt=1;
for(int i=1;i<=num;i++){
scanf("%d %d %lf",&p->data[cnt].row,&p->data[cnt].col,&p->data[cnt].value);
p->nums++;
cnt++;
}
}
//計(jì)算
void compute(TSMatrix *p1,TSMatrix *p2,TSMatrix *p3,char c)
{
int m,n,num;
printf("請輸入要進(jìn)行計(jì)算的稀疏矩陣的行數(shù)和列數(shù) m n:");
scanf("%d %d",&m,&n);
init(p1,m,n);
init(p2,m,n);
init(p3,m,n);
printf("請輸入第一個(gè)矩陣的非零元素個(gè)數(shù):\n");
scanf("%d",&num);
printf("請輸入第一個(gè)矩陣的非零元素三元組:\n");
input(p1,num);
printf("請輸入第二個(gè)矩陣的非零元素個(gè)數(shù):\n");
scanf("%d",&num);
printf("請輸入第二個(gè)矩陣的非零元素三元組:\n");
input(p2,num);
int cnt=1;
int i=1,j=1;
while(i<=p1->nums&&j<=p2->nums){
if(p1->data[i].row<p2->data[j].row){
p3->data[cnt]=p1->data[i];
p3->nums++;
cnt++;
i++;
}else if(p1->data[i].row>p2->data[j].row){
p3->data[cnt]=p2->data[j];
p3->nums++;
cnt++;
j++;
}else{
if(p1->data[i].col<p2->data[j].col){
p3->data[cnt]=p1->data[i];
p3->nums++;
cnt++;
i++;
}else if(p1->data[i].col<p2->data[j].col){
p3->data[cnt]=p2->data[j];
p3->nums++;
cnt++;
j++;
}else{
p3->data[cnt]=p1->data[i];
p3->data[cnt].value= c=='+'?p1->data[i].value+p2->data[j].value:p1->data[i].value-p2->data[j].value;
p3->nums++;
cnt++;
i++;
j++;
}
}
}
while(i<=p1->nums) {
p3->data[cnt]=p1->data[i];
p3->nums++;
cnt++;
i++;
}
while(j<=p2->nums){
p3->data[cnt]=p2->data[j];
p3->nums++;
cnt++;
j++;
}
}
//乘法
void mulCompute(TSMatrix *p1,TSMatrix *p2,TSMatrix *p3)
{
int m,n,num,cnt=1;
printf("請輸入第一個(gè)稀疏矩陣的行數(shù)和列數(shù) m n:");
scanf("%d %d",&m,&n);
init(p1,m,n);
printf("請輸入第二個(gè)稀疏矩陣的行數(shù)和列數(shù) m n:");
scanf("%d %d",&m,&n);
init(p2,m,n);
if(p1->cols!=p2->rows){
printf("無法進(jìn)行乘法運(yùn)算");
return;
}
init(p3,p1->rows,p2->cols);
printf("請輸入第一個(gè)矩陣的非零元素個(gè)數(shù):\n");
scanf("%d",&num);
printf("請輸入第一個(gè)矩陣的非零元素三元組:\n");
input(p1,num);
printf("請輸入第二個(gè)矩陣的非零元素個(gè)數(shù):\n");
scanf("%d",&num);
printf("請輸入第二個(gè)矩陣的非零元素三元組:\n");
input(p2,num);
for(int i=1;i<=p1->rows;i++){
for(int j=1;j<=p2->cols;j++){
double sum=0;
//sum表示p1中第i行元素與p2中第j列元素對應(yīng)相乘之和
for(int k=1;k<=p1->cols;k++){
sum+=get(p1,i,k)*get(p2,k,j);
}
if(sum){
p3->data[cnt].row=i;
p3->data[cnt].col=j;
p3->data[cnt].value=sum;
cnt++;
p3->nums++;
}
}
}
}
//獲取三元組p中存儲(chǔ)中處于m行n列的元素值
double get(TSMatrix *p,int m,int n)
{
for(int i=0;i<=p->nums;i++){
if(p->data[i].row==m&&p->data[i].col==n){
return p->data[i].value;
}
}
return 0;
}
//稀疏矩陣的轉(zhuǎn)置
void transpose(TSMatrix *p,TSMatrix *p3)
{
int m,n,num;
printf("請輸入要進(jìn)行轉(zhuǎn)置的稀疏矩陣的行數(shù)和列數(shù) m n:");
scanf("%d %d",&m,&n);
init(p,m,n);
printf("請輸入該矩陣的非零元素個(gè)數(shù):\n");
scanf("%d",&num);
printf("請輸入該矩陣的非零元素三元組:\n");
input(p,num);
p3->cols=p->rows;
p3->rows=p->cols;
p3->nums=p->nums;
int num1[(p->nums)+1]={0};
int pos[(p->nums)+1]={0};
if(p->nums){
for(int i=1;i<=p->nums;i++){
num1[p->data[i].col]++;
}
pos[1]=1;
for(int i=2;i<=p->nums;i++){
pos[i]=pos[i-1]+num1[i-1];
}
for(int i=1;i<=p->nums;i++){
p3->data[pos[p->data[i].col]].col=p->data[i].row;
p3->data[pos[p->data[i].col]].row=p->data[i].col;
p3->data[pos[p->data[i].col]].value=p->data[i].value;
pos[p->data[i].col]++;
}
}
}
到了這里,關(guān)于稀疏矩陣的運(yùn)算-加、減、乘、轉(zhuǎn)置(C-數(shù)據(jù)結(jié)構(gòu))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!