您的位置:首页 > 理论基础 > 数据结构算法

c语言数据结构——三元数组的快速转置

2017-03-28 22:40 309 查看
了解好三元数组快速转置的思路敲出代码应该不是很难的。

#include<stdio.h>
#include<stdlib.h>
#define Max 1000

typedef struct//每个非零元素的,其中包括
{
int i, j, data;//这个元素是第i行第j列值为data;
}Data;
typedef struct//表示一个三元数组。其中包括
{
int n,m, t;//总行数总列数和非零元的个数。
Data elem[Max];//每个非零元素
}syz;

void Creat_syz(syz * s);//为三元数组s进行elem[]元素赋值
void Print_syz(const syz*s);//输出三元数组s。
void transfer_syu(const syz*s, syz*b);
int main()
{
syz s,s1;
scanf("%d %d %d",&s.n, &s.m, &s.t);
Creat_syz(&s);
Print_syz(&s);
transfer_syu(&s,&s1);
Print_syz(&s1);

return 0;
}
void Creat_syz(syz * s)
{
for(int i = 0; i < s->t; i++){
scanf("%d %d %d",&s->elem[i].i, &s->elem[i].j, &s->elem[i].data);
}
}
void Print_syz(const syz*s)
{
for(int i = 0; i < s->t; i++){
printf("%d %d %d\n",s->elem[i].i, s->elem[i].j, s->elem[i].data);
}
}
void transfer_syu(const syz*a,  syz*b)
{
b->n = a->n;
b->m = a->m;
b->t = a->t;

int x[Max] ={0};
int y[Max],k,p;
for(int i=0; i<a->t; i++){//计算原三元数组中没列的元素个数
k = a->elem[i].j;
x[k]++;
}
y[0]=0;
for(int i=1; i<a->m; i++){//计算原三元数组中每列的第一个元素在转置后 elem数组中的位置;
y[i] = y[i-1]+x[i-1];
}
for(int i = 0; i<a->t; i++){
k = a->elem[i].j;
p = y[k];
b->elem[p].i = a->elem[i].j;
b->elem[p].j = a->elem[i].i;
b->elem[p].data = a->elem[i].data;
y[k]++;//该列的后一个元素了;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息