稀疏矩阵的快速转置(C语言版)
2015-11-30 21:10
579 查看
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
typedef struct node{
int i,j,v;
}SYZ;
void createlist(SYZ *L,SYZ a[MAX],int x,int y,int z){
int n=0;
a
.i=x; a
.j=y; a
.v=z;
n++;
printf("请输入数字所在的行数、列数以及对应的数值:\n\n");
scanf("%d",&a
.i);scanf("%d",&a
.j);scanf("%d",&a
.v);
n++;
for(;n <= z;n++)
{
scanf("%d",&a
.i);
scanf("%d",&a
.j);
scanf("%d",&a
.v);
}
}
/*选择排序法,对三元组行升序排序*/
void DataSort(SYZ *L,int x,SYZ a[MAX])
{
int s,t,k,temp1,temp2,temp3;
for(s=1;s<x;s++)
{ t=s;
for(k=s+1;k<=x;k++)
{
if(a[t].i>a[k].i){ t=k; }
}
if(t!=s)
{
temp1=a[s].i; /*行交换*/
a[s].i=a[t].i;
a[t].i=temp1;
temp2=a[s].j; /*列交换*/
a[s].j=a[t].j;
a[t].j=temp2;
temp3=a[s].v; /*数值交换*/
a[s].v=a[t].v;
a[t].v=temp3;
}
}
}
void print(SYZ a[MAX],int x,int y,int m[x][y])
{
printf("稀疏矩阵为:\n\n");
int i,j,k,s,r,t;
for(i=0;i<x;i++)
for(k=0;k<y;k++)
m[i][k]=0; /*初始化为0*/
for(i=1;i<=a[0].v;i++){
s=a[i].i;r=a[i].j;t=a[i].v;
m[s-1][r-1]=t; /*填入非零数值*/
}
for(i=0;i<x;i++)
{
for(j=0;j<y;j++) printf("%6d",m[i][j]);
printf("\n");
}
}
void fillNum(SYZ a[],int num[]) /*num-->统计每列非零元素的个数*/
{
int i=0,k;
for(i=1;i<=a[0].v;i++) num[i]=0;
for(i=1;i<=a[0].v;i++) { k=a[i].j;num[k]++;}
}
void fillPos(int num[],int pos[],SYZ a[]){ /*pos-->统计每列非零元素的位置*/
int i;
for(i=2;i<=a[0].j;i++){ pos[1]=1;pos[i]=pos[i-1]+num[i-1];}
}
void ZZ(SYZ a[],int pos[],SYZ b[]) /*三元组快速转置*/
{
int i=1,ma,p;
for(;i<=a[0].v;i++){
ma=a[i].j;p=pos[ma];
b[p].i=a[i].j;
b[p].j=a[i].i;
b[p].v=a[i].v;
pos[ma]++;
}
}
void print2(SYZ b[],int x,int y,int n[y][x],SYZ a[])
{
printf("\n转置后的矩阵为:\n");
int i,j,k,s,r,t;
for(i=0;i<y;i++)
for(j=0;j<x;j++)
n[i][j]=0; /*初始化为0*/
for(k=1;k<=a[0].v;k++){
s=b[k].i;r=b[k].j;t=b[k].v;
n[s-1][r-1]=t; /*填入非零数值*/
}
for(i=0;i<y;i++)
{
for(j=0;j<x;j++) printf("%6d",n[i][j]);
printf("\n");
}
}
int main()
{
SYZ L;
int x,y,z;
printf("请依次输入矩阵总的行数、列数、以及非零字符的个数:\n");
scanf("%d",&x);scanf("%d",&y);scanf("%d",&z);
SYZ a[MAX]; /*原三元组*/
createlist(&L,a,x,y,z);/*创建三元组*/
DataSort(&L,x,a); /*对三元组按行进行升序排列*/
int m[x][y],n[y][x];
print(a,x,y,m); /*输出原矩阵*/
SYZ b[MAX]; /*倒置三元组*/
int num[y],pos[y];
fillNum(a,num); /*num-->统计每列非零元素的个数*/
fillPos(num,pos,a); /*pos-->统计每列非零元素的位置*/
ZZ(a,pos,b); /*三元组快速转置,元素置于b数组*/
print2(b,x,y,n,a);/*输出新矩阵,不可用print()输出*/
return 0;
}
#include <stdlib.h>
#define MAX 100
typedef struct node{
int i,j,v;
}SYZ;
void createlist(SYZ *L,SYZ a[MAX],int x,int y,int z){
int n=0;
a
.i=x; a
.j=y; a
.v=z;
n++;
printf("请输入数字所在的行数、列数以及对应的数值:\n\n");
scanf("%d",&a
.i);scanf("%d",&a
.j);scanf("%d",&a
.v);
n++;
for(;n <= z;n++)
{
scanf("%d",&a
.i);
scanf("%d",&a
.j);
scanf("%d",&a
.v);
}
}
/*选择排序法,对三元组行升序排序*/
void DataSort(SYZ *L,int x,SYZ a[MAX])
{
int s,t,k,temp1,temp2,temp3;
for(s=1;s<x;s++)
{ t=s;
for(k=s+1;k<=x;k++)
{
if(a[t].i>a[k].i){ t=k; }
}
if(t!=s)
{
temp1=a[s].i; /*行交换*/
a[s].i=a[t].i;
a[t].i=temp1;
temp2=a[s].j; /*列交换*/
a[s].j=a[t].j;
a[t].j=temp2;
temp3=a[s].v; /*数值交换*/
a[s].v=a[t].v;
a[t].v=temp3;
}
}
}
void print(SYZ a[MAX],int x,int y,int m[x][y])
{
printf("稀疏矩阵为:\n\n");
int i,j,k,s,r,t;
for(i=0;i<x;i++)
for(k=0;k<y;k++)
m[i][k]=0; /*初始化为0*/
for(i=1;i<=a[0].v;i++){
s=a[i].i;r=a[i].j;t=a[i].v;
m[s-1][r-1]=t; /*填入非零数值*/
}
for(i=0;i<x;i++)
{
for(j=0;j<y;j++) printf("%6d",m[i][j]);
printf("\n");
}
}
void fillNum(SYZ a[],int num[]) /*num-->统计每列非零元素的个数*/
{
int i=0,k;
for(i=1;i<=a[0].v;i++) num[i]=0;
for(i=1;i<=a[0].v;i++) { k=a[i].j;num[k]++;}
}
void fillPos(int num[],int pos[],SYZ a[]){ /*pos-->统计每列非零元素的位置*/
int i;
for(i=2;i<=a[0].j;i++){ pos[1]=1;pos[i]=pos[i-1]+num[i-1];}
}
void ZZ(SYZ a[],int pos[],SYZ b[]) /*三元组快速转置*/
{
int i=1,ma,p;
for(;i<=a[0].v;i++){
ma=a[i].j;p=pos[ma];
b[p].i=a[i].j;
b[p].j=a[i].i;
b[p].v=a[i].v;
pos[ma]++;
}
}
void print2(SYZ b[],int x,int y,int n[y][x],SYZ a[])
{
printf("\n转置后的矩阵为:\n");
int i,j,k,s,r,t;
for(i=0;i<y;i++)
for(j=0;j<x;j++)
n[i][j]=0; /*初始化为0*/
for(k=1;k<=a[0].v;k++){
s=b[k].i;r=b[k].j;t=b[k].v;
n[s-1][r-1]=t; /*填入非零数值*/
}
for(i=0;i<y;i++)
{
for(j=0;j<x;j++) printf("%6d",n[i][j]);
printf("\n");
}
}
int main()
{
SYZ L;
int x,y,z;
printf("请依次输入矩阵总的行数、列数、以及非零字符的个数:\n");
scanf("%d",&x);scanf("%d",&y);scanf("%d",&z);
SYZ a[MAX]; /*原三元组*/
createlist(&L,a,x,y,z);/*创建三元组*/
DataSort(&L,x,a); /*对三元组按行进行升序排列*/
int m[x][y],n[y][x];
print(a,x,y,m); /*输出原矩阵*/
SYZ b[MAX]; /*倒置三元组*/
int num[y],pos[y];
fillNum(a,num); /*num-->统计每列非零元素的个数*/
fillPos(num,pos,a); /*pos-->统计每列非零元素的位置*/
ZZ(a,pos,b); /*三元组快速转置,元素置于b数组*/
print2(b,x,y,n,a);/*输出新矩阵,不可用print()输出*/
return 0;
}
相关文章推荐
- 邻接表的实现与深度遍历
- 顺时针打印矩阵(C++版)
- C语言位运算符:与、或、异或、取反、左移和右移
- LeetCode_Jump Game
- C语言精华代码
- c++命令结束进程树
- C++中关于运算符 “.”和“->”的区分
- 【C语言提高12】间接赋值从0级指针到1级指针
- C语言根据路径打开文件内容
- codeforces 499B Lecture(map与string简单用法)
- 2015杭电新生赛1008游乐场【神坑】
- C++常量折叠
- 关于C++中各种运算符的总结和简要介绍
- C++11学习笔记8---错误处理
- C++11学习笔记7---资源回收RAII
- Ubuntu下C/C++man手册安装方法及使用方法
- 指针访问真的高效吗
- 黑马程序员——C语言循环、switch与if语句笔记和习题
- 【粗解】【通信编码】卷积编码器的简单实现
- C/C++结构体struct详解