上周就做完了,拖了一周今天才来写。题目如下:
看一下题目,就是创建三元组表然后转置再输出。
我采取的方法是,先得到矩阵每一列非0元的个数,那么每一列第一个元素在新的三元表中的位置就是上一列的非0元的个数加上上一列第一个元素在新三元表的位置之和。示例如下:
以下是我的实现:
#include <stdio.h>
#include <stdlib.h>
struct Triple
{
int ti;
int tj;
int value;
};
struct tripleList
{
struct Triple T[2000];
int li;
int lj;
int ln;
};
void createNewTripleList (struct tripleList *list1);
void printTripleList (struct tripleList *list);
void change (struct tripleList *list1,struct tripleList *list2,int colPot[]);
void run ();
void getColPot (struct tripleList *list,int colPot[]);
int main()
{
run ();
return 0;
}
void run ()
{
int colPot[2000]={0};
struct tripleList list1,list2;
createNewTripleList (&list1);
getColPot (&list1,colPot);
change (&list1,&list2,colPot);
printTripleList (&list2);
}
void createNewTripleList (struct tripleList *list1)
{
int i=0,a,b,c;
scanf ("%d%d",&(list1->li),&(list1->lj));
while (1)
{
scanf ("%d%d%d",&a,&b,&c);
if (a==0&&b==0&&c==0)
{
break;
}
list1->T[i].ti=a;
list1->T[i].tj=b;
list1->T[i].value=c;
i++;
}
list1->ln=i;
}
void getColPot (struct tripleList *list,int colPot[])
{
int n[2000]={0};
int i,pre1=0,pre2=0;
for (i=0;i<=list->ln-1;i++)
{
(n[list->T[i].tj])++;
}
for (i=0;i<=list->lj-1;i++)
{
colPot[i]=pre1+pre2;
pre1=n[i];
pre2=colPot[i];
}
}
void printTripleList (struct tripleList *list)
{
int i;
for (i=0;i<=list->ln-1;i++)
{
printf ("%d %d %d\n",list->T[i].ti,list->T[i].tj,list->T[i].value);
}
}
void change (struct tripleList *list1,struct tripleList *list2,int colPot[])
{
int i,n;
list2->li=list1->lj;
list2->lj=list1->li;
list2->ln=list1->ln;
for (i=0;i<=list1->ln-1;i++)
{
n=colPot[list1->T[i].tj];
list2->T[n].ti=list1->T[i].tj;
list2->T[n].tj=list1->T[i].ti;
list2->T[n].value=list1->T[i].value;
(colPot[list1->T[i].tj])++;
}
}
以下是各函数的注释:
void createNewTripleList (struct tripleList *list1)
{
int i=0,a,b,c;
scanf ("%d%d",&(list1->li),&(list1->lj));//输入行数和列数
while (1)
{
scanf ("%d%d%d",&a,&b,&c);//输入三元表
if (a==0&&b==0&&c==0)//当都为0时停止输入
{
break;
}
list1->T[i].ti=a;//行
list1->T[i].tj=b;//列
list1->T[i].value=c;//值
i++;
}
list1->ln=i;//三元组表元素个数
}
void getColPot (struct tripleList *list,int colPot[])
{
int n[2000]={0};
int i,pre1=0,pre2=0;
for (i=0;i<=list->ln-1;i++)//得到矩阵每列的非0元个数
{
(n[list->T[i].tj])++;
}
for (i=0;i<=list->lj-1;i++)
{
colPot[i]=pre1+pre2;//本列列第一个非0元素在新表的位置,上一列的非0元的个数加上上一列第一个元素在新三元表的位置
pre1=n[i];
pre2=colPot[i];
}
}
void change (struct tripleList *list1,struct tripleList *list2,int colPot[])
{
int i,n;
list2->li=list1->lj;//行 列 个数赋值
list2->lj=list1->li;
list2->ln=list1->ln;
for (i=0;i<=list1->ln-1;i++)//依次遍历原三元表
{
n=colPot[list1->T[i].tj];//得到当前元素在新三元表中位置
list2->T[n].ti=list1->T[i].tj;//转置赋值
list2->T[n].tj=list1->T[i].ti;
list2->T[n].value=list1->T[i].value;
(colPot[list1->T[i].tj])++;//位置自增,以便同列的下一个元素找到正确位置
}
}
void printTripleList (struct tripleList *list)
{
int i;
for (i=0;i<=list->ln-1;i++)//遍历新三元表并输出
{
printf ("%d %d %d\n",list->T[i].ti,list->T[i].tj,list->T[i].value);
}
}
void run ()
{
int colPot[2000]={0};
struct tripleList list1,list2;
createNewTripleList (&list1);//创建三元表
getColPot (&list1,colPot);//得到位置数组
change (&list1,&list2,colPot);//转置
printTripleList (&list2);//输出
}
以上就是我的实现,希望给大家带来帮助。