关闭

[置顶] 数据结构学习记录-矩阵的快速转置

标签: 数据结构struct编程存储
2041人阅读 评论(0) 收藏 举报
分类:

现在发现自己的编程有了很大的提高,设计程序的速度比以前快多了,思想也有了比较大的进步,我想数据结构需要有一个严谨的逻辑思维吧!这是一个矩阵转置的程序,所有的都是自己编写的,虽然有点乱,但我觉得自己已经在慢慢进步了!!!

定义包含头文件的文件,名为t11.h

#include"stdio.h"
#include"string.h"
#include"ctype.h"
#include"malloc.h"
#include"stdlib.h"  //atoi(),exit();
#include"io.h"      //eof()
#include"math.h"


#define  TRUE  1
#define  FALSE  0
#define  OK   1
#define  ERROR 0

typedef int Status;
typedef int Boolean;

 

之后定义数据类型,名为jz.h

typedef struct
{
 int *elem;
 int i;
 int j;
 int size;
 int fz;
}jz;

struct node
{
 int i;
 int j;
 int data;
};

typedef struct
{
 node *ptr;
 int col;
 int lie;
 int geshu;
}san;

 

定义实现函数名为jz.cpp

 

jz initjz(jz &L)       //   初始化矩阵
{  
 jz R;
    printf("输入矩阵的行和列:");
 scanf("%d%d",&L.i,&L.j);
 L.size=L.i*L.j;
 L.elem=(int*)malloc(L.size*sizeof(int));    //  开辟存入矩阵内存单元
 R.elem=(int*)malloc(L.size*sizeof(int));    //  开辟转置矩阵内存单元
 int i=0;
 while(i<L.size)            //  将矩阵值全部置为0
 {
  *(L.elem+i)=0;
  *(R.elem+i)=0;
  i++;
 }
 return R;         //  将R返回
 
}

void shuru(jz &L)              //  矩阵的初始化,输入值
{
 int i,j,data;
 char ch='y';
 printf("输入矩阵的非0元,行号、列号、元素值:");
 scanf("%d%d%d",&i,&j,&data);
    *(L.elem+(i-1)*L.j+j-1)=data;
 L.fz=1;                         //   输入非零值的个数
 printf("是否继续(y/n):");
 getchar();
 ch=getchar();
 while('y' == ch || 'Y' == ch)
 {
  printf("输入矩阵的非0元的行号、列号、元素值:");
  scanf("%d%d%d",&i,&j,&data);
  *(L.elem+(i-1)*L.j+j-1)=data;
  L.fz++;
  printf("是否继续(y/n):");
  getchar();
  ch=getchar();
 }
 // printf("fz=%d\n",L.fz);
}

void cunsan(jz L,san &T)     //  将矩阵中的非零值,行号、列号存入到三元表中
{
 T.col=L.i;
 T.lie=L.j;
 T.geshu=L.fz;
 int i=1,j,k=0;
 
 T.ptr=(struct node*)malloc(L.fz*sizeof(struct node));   //  开辟存储三元表的大小
 
 while(i<=L.i)      //   寻找非零元
 {
  j=1;
  while(j<=L.j)
  {
   if(0 != *(L.elem+(i-1)*L.j+j-1))
   {
    (T.ptr+k)->i=i;
    (T.ptr+k)->j=j;
    (T.ptr+k)->data=*(L.elem+(i-1)*L.j+j-1);
    k++;
   }
   j++;
  }
  i++;
 }
 
}

void zhuanzhi(jz L,san T,san &Q)
{
 //printf("转置函数进入啦!\n");
 // getchar();
    int*p,*q,k,r;
 p=(int*)malloc(T.lie*sizeof(int));             //  构造两个辅助空间,p记录每一列的非零元的个数
 q=(int*)malloc(T.lie*sizeof(int));             //  q记录每一列的第一个非零元的位置,p第一列有3个非零元,第二列有1个非零元,q第一次为1,第二次为4
    Q.ptr=(struct node*)malloc(L.fz*sizeof(struct node));  //  开辟转置后的三元表空间内存
 int i=0;
 for(;i<T.lie;i++)               //  将开辟的空间值置0
  *(p+i)=0;
 //printf("输出值1:%d \n",*(p+i)=0);
 for(i=0;i<T.geshu;i++)          //  查找稀疏三元表中得列号,p+(T.ptr+i)->j-1) 表示(T.ptr+i)->j的列号相同指针指向内存空间,取得该地址的值加1,表示对应列又有一个元素
  
  ++(*(p+(T.ptr+i)->j-1));
 
 
 //printf("输出值:%d \n",*(p+(T.ptr+i)->j-1));
 
 *q=1;
 for(i=1;i<T.lie;i++)      //  查找稀疏三元表,知道列号,就能够将其存入到指定位置,
  *(q+i)=*(q+i-1)+(*(p+i-1));  //  辅助q,第一个为1,下一列的起始位置要加上前面的个数,*(p+i-1)表示该列在转置稀疏三元表中得位置
 for(i=0;i<T.geshu;i++)      //  依次往下查找列号
 {
        k=(T.ptr+i)->j;        //  将列号赋给k
        r=*(q+k-1);            //  将k对应的列号,在q中查找k列对应的起始位置
  (Q.ptr+r-1)->i=(T.ptr+i)->j;    //  找到起始位置,将对应的值存入
  (Q.ptr+r-1)->j=(T.ptr+i)->i;
        (Q.ptr+r-1)->data=(T.ptr+i)->data;
  ++(*(q+k-1));        //  q中对应的下一个位置就要下移一个
 }
    Q.col=T.lie;
 Q.lie=T.col;
 Q.geshu=T.geshu;
}

void print(jz L,san T,san Q,jz &R)    // 打印输出
{
 
    int i=0;
 R.size=L.size;
 printf("矩阵为:\n\t\t\t");
 while(i<L.size)
 {
  printf("%-4d",*(L.elem+i));
  if((i+1)%L.j == 0)
   printf("\n\n\t\t\t");
  i++;
 }
 printf("稀疏三元矩阵为:\n");
 i=0;
 while(i<L.fz)
 {
  printf("\t\t\t%-4d%-4d%-4d\n\n",(T.ptr+i)->i,(T.ptr+i)->j,(T.ptr+i)->data);
  i++;
 }
 printf("转置后的稀疏三元矩阵为:\n");
 i=0;
 while(i<L.fz)
 {
  printf("\t\t\t%-4d%-4d%-4d\n\n",(Q.ptr+i)->i,(Q.ptr+i)->j,(Q.ptr+i)->data);
  *(R.elem+((Q.ptr+i)->i-1)*Q.lie+(Q.ptr+i)->j-1)=(Q.ptr+i)->data;
  i++;
 }
 printf("转置矩阵为:\n");
    i=0;
 printf("\t\t\t");
 while(i<R.size)
 {
  printf("%-4d",*(R.elem+i));
  if((i+1)%Q.lie == 0)
   printf("\n\n\t\t\t");
  i++;
 }
   
 printf("\n");
 
}

 

最后就是主函数的调用了,文件名为main_jz.cpp

 

#include"t11.h"
#include"jz.h"
#include"jz.cpp"

void main()
{
 jz S,R;  //  定义两个矩阵
 san T,Q; //  定义两个三元表
 R=initjz(S);  // 分别对矩阵初始化
 shuru(S);     //  输入矩阵非零元
 cunsan(S,T);   //  将非零元存入稀疏三元表中
 zhuanzhi(S,T,Q);  // 快速转置
 print(S,T,Q,R);   // 打印输出
}

这是我自己独立设计的第5个实验了,所有代码构建都是自己完成的,在设计的过程中,跟着自己的思想,很快就把完整程序编写出来了,我相信自己的编程水平已经有了很大的提升,只要不怕困难,敢于专研奋斗,会有自己的一片天地!献给共同奋斗路上的编程朋友。。。。留住最真的于2012.03.24.22:58写~~~~~~~~~~~~~~~~~

 

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:113531次
    • 积分:1489
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:8篇
    • 译文:0篇
    • 评论:131条
    最新评论