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

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

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

定义包含头文件的文件,名为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写~~~~~~~~~~~~~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: