Está en la página 1de 5

#include <iostream>

#include <stdlib.h>
#include <stdio.h>

using namespace std;


struct columnas{
int dato;
columnas *sig_col;
};
struct filas{
filas *sig_fila;
columnas *columna;
};
struct matriz{
int nf,nc;
filas *fila;
};
matriz *crear(matriz *m1,int nc,int nf);
matriz *transpuesta(matriz *m1);
main (){
matriz *matriz1=NULL,*matriz2,*matriz3;
int nc,nf,op;
do{
cout<<"ingrese la opcion <1>Crear;<2>Transpuesta,<4>Salir\n";
cin>>op;
switch(op){
case 1:{
cout<<"ingrese numero de filas";
cin>>nf;
cout<<"ingrese n de columnas";
cin>>nc;
matriz1=crear(matriz1,nc,nf);
break;
}
case 2:{
if(matriz1!=NULL)
matriz1=transpuesta(matriz1);
else
cout<<"no hay una matriz\n";
break;
}
}
}while(op!=4);
}
matriz *crear(matriz *m1,int nc,int nf){
m1=(matriz*)malloc(sizeof(matriz));
m1->fila=NULL;
m1->nf=nf;
m1->nc=nc;
filas *fil,*fant,*faux,*ftrans;
columnas *col,*cant,*caux,*ctrans;
fil=NULL;
for(int j=0;j<m1->nf;j++){
cout<<"fila"<<(j+1)<<"\n";
fant=fil;
fil=(filas*)malloc(sizeof(filas));
fil->sig_fila=NULL;
col=NULL;
for(int i=0;i<m1->nc;i++){
cant=col;
col=(columnas*)malloc(sizeof(columnas));
cout<<"ingrese dato";
cin>>col->dato;
col->sig_col=NULL;
if(m1->fila==NULL){
m1->fila=fil;
}else{
if(cant!=NULL)
cant->sig_col=col;
}
if(cant==NULL){
fil->columna=col;
}
}
if(fant!=NULL){
fant->sig_fila=fil;
}
}
//imprimir
faux=m1->fila;
while(faux!=NULL){
caux=faux->columna;
while(caux!=NULL){
cout<<"["<<caux->dato<<"]";
caux=caux->sig_col;
}
cout<<"\n";
faux=faux->sig_fila;
}
return(m1);
}

matriz *transpuesta(matriz *m1){


filas *fil,*fant,*faux,*ftrans;
columnas *col,*cant,*caux,*ctrans;
//Transpuesta
faux=m1->fila;
caux=faux->columna;
//conectar todo a la fila 1
for(int j=0;j<m1->nf;j++){
if(m1->nc>1){
if(caux->sig_col==NULL){
caux->sig_col=faux->columna;
caux=caux->sig_col;
}else{
caux=faux->columna;
}
for(int i=1;i<m1->nc;i++){
caux=caux->sig_col;
}
}else{
if(m1->nf!=1)
caux->sig_col=faux->columna;
caux=caux->sig_col;
}
faux=faux->sig_fila;
}
faux=m1->fila;
caux=faux->columna;
//limpiar memoria en caso de 1 columna
if(m1->nc==1&&m1->nf!=1){
faux=m1->fila;
while(faux!=NULL){
fant=faux;
caux=faux->columna;
while(caux!=NULL){
caux=caux->sig_col;
}
faux=faux->sig_fila;
if(fant->sig_fila=NULL)
free(fant);
}
}
//apuntar un auxiliar a los indices de filas
if(m1->nc>1){
faux=m1->fila;
caux=faux->columna;
int numerof=m1->nf,numeroc=m1->nc;
numeroc=m1->nf;
numerof=m1->nc;
for(int j=0;j<numerof;j++){
if(j>=m1->nf){
faux=(filas*)malloc(sizeof(filas));
fant->sig_fila=faux;
faux->sig_fila=NULL;
}
faux->columna=caux;
caux=caux->sig_col;
(faux->columna)->sig_col=NULL;
fant=faux;
if(j!=(numerof-1)){
if(faux->sig_fila!=NULL)
faux=faux->sig_fila;
}else
{
faux->sig_fila=NULL;
}
}
//conectar la segundas columnas
if(m1->nf>1){
faux=m1->fila;
for(int j=0;j<numerof;j++){
ctrans=faux->columna;
(ctrans->sig_col)=caux;
caux=caux->sig_col;
(ctrans->sig_col)->sig_col=NULL;
faux=faux->sig_fila;
}
}
//conectar las demas columnas
if(m1->nf>2){
faux=m1->fila;
for(int i=2;i<numeroc;i++){
faux=m1->fila;
for(int j=0;j<numerof;j++){
ctrans=faux->columna;
for(int k=1;k<i;k++){
ctrans=ctrans->sig_col;
}
(ctrans->sig_col)=caux;
if(caux->sig_col!=NULL)
caux=caux->sig_col;
(ctrans->sig_col)->sig_col=NULL;
faux=faux->sig_fila;
}
}
}
}
//imprimir
cout<<"Transpuesta\n";
faux=m1->fila;
while(faux!=NULL){
caux=faux->columna;
while(caux!=NULL){
cout<<"["<<caux->dato<<"]";
caux=caux->sig_col;
}
cout<<"\n";
faux=faux->sig_fila;
}
return(m1);
}

También podría gustarte