数据结构实验

来源:互联网 发布:淘宝批量上传宝贝教程 编辑:程序博客网 时间:2024/04/28 17:37

稀疏矩阵的操作:新建,求转置,相加

#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
typedef int ElemType;
typedef struct matrtype{
int i,j; //行列角标
ElemType e; //元素
struct matrtype *next;
} matrtype;

typedef struct{
matrtype *matr;
int m,n,t; //行数,列数,非零元个数
}table;

int inimatr(table **Mat){ //初始化矩阵
(*Mat)=(table *)malloc(sizeof(table));
if(!(*Mat)) {printf("initialize fail!"); exit(0);}
(*Mat)->matr=NULL;
(*Mat)->m=(*Mat)->n=(*Mat)->t=0;
return 1;
}

int newmatr(table **Mat){ //新建一个矩阵
int ix,jx,ex;
matrtype *p,*h;
if(inimatr(Mat)!=1) {printf("NOT Mat!"); return 0;} //初始化不成功
printf("INPUT m,n:/t");
scanf("%d,%d",&((*Mat)->m),&((*Mat)->n));
while(((*Mat)->t)<((*Mat)->m)*((*Mat)->n)){
printf("INPUT i,j,e|input 0 OVER:/t");
scanf("%d,%d,%d",&ix,&jx,&ex);  //输入行列坐标及元素
if(ix>=1&&jx>=1&&ix<=(*Mat)->m&&jx<=(*Mat)->n)
 {p=(matrtype *)malloc(sizeof(matrtype));
 p->i=ix; p->j=jx; p->e=ex; p->next=NULL;
 if(!((*Mat)->matr)) {(*Mat)->matr=p; h=p;}   //Max指向第一个节点
 else {h->next=p; h=h->next;}
 ((*Mat)->t)++; //非零元素加1
 }
else break;
};
}

outmatr(table *Mat){  //输出矩阵
int a,b,i;
matrtype *p;
if(!Mat) {printf("It's is NULL,please create one!/n"); return;}
if(!(Mat->matr)) {printf("Matrix is NULL!/n"); return;}
 p=Mat->matr;
for(i=0;i<25;i++) printf(" "); 
printf("|");for(b=0;b<=(Mat->n);b++)printf("/t");printf("|/n");
for(a=1;a<=(Mat->m);a++)
 { for(i=0;i<25;i++) printf(" "); 
  printf("|/t");
  for(b=1;b<=(Mat->n);b++)
  {p=Mat->matr;
   while(p)
    {if(p->i==a&&p->j==b) break;
    p=p->next;}
  if(p) printf("%d/t",p->e);
  else printf("0/t");
  }
  printf("|/n");
  for(i=0;i<25;i++) printf(" "); 
  printf("|");for(b=0;b<=(Mat->n);b++)printf("/t");printf("|/n");
 }
  printf("successful, input anykey back to Main Menu ...");
  getch(); printf("/n");
}

table *convert(table *Mat){  //求Mat的转置
 table *tma=NULL;
 matrtype *h,*r,*p;
 if(inimatr(&tma)!=1)  {printf("INI tma fail/n"); return;}//初始化失败
 p=Mat->matr;
 if(!Mat||!p)  {printf("It's NULL!/n"); return;}
 while(p){
  r=(matrtype *)malloc(sizeof(matrtype));
  r->e=p->e; r->i=p->j;  r->j=p->i;  r->next=NULL;
  if(!(tma->matr)) {tma->matr=r; h=r;}   //tma指向第一个节点
  else {h->next=r; h=h->next;}
  (tma->t)++; //非零元素加1
  p=p->next;
  }
 tma->m=Mat->n; tma->n=Mat->m;
 return tma;
 }
 
table *Matrixplus(table *Mat1,table *Mat2){ //矩阵相加
 table *tma=NULL;
 matrtype *h,*r,*p,*t[100];
 int a,b;//,i1,i2,j1,j2;
 if(!Mat1||!Mat2||!(Mat1->matr)||!(Mat2->matr)) {printf("It`s NULL!/n"); return;} //空矩阵
 if((Mat1->n)!=(Mat2->n)||(Mat1->m)!=(Mat2->m))
  {printf("Matrixes` Row or Col is`t equal!/n"); return NULL;} //行列不等,不能相加
 if(inimatr(&tma)!=1)  {printf("INI tma fail in Matrixplus!/n"); return NULL;}
 tma->m=Mat1->m;tma->n=Mat1->n;
 p=Mat1->matr; a=0;
 while(p){
  t[a++]=p;  p=p->next;
  }//循环将Mat1中元素指针放入t[]数组中
 b=a-1;
 p=Mat2->matr;
 while(p){
  r=(matrtype *)malloc(sizeof(matrtype));
  r->i=p->i;  r->j=p->j;  //用i1和j1存放r元素的脚标i1=j1=
  r->e=p->e; r->next=NULL;
  for(a=0;a<=b;a++){
  // i2=t[a]->i;j2=t[a]->j;  //用i2和j2存放t[a]元素的脚标
   if(r->i==t[a]->i&&r->j==t[a]->j)//if(i1==i2&&j1==j2)
   { (r->e)=(r->e)+((t[a])->e);
    t[a]=t[b]; b--;     //删掉t[i],且t[]中的元素个数减一
    break;
    }
   }
  if(!(tma->matr)) {tma->matr=r;}
  else {h->next=r;}
  h=r;
  (tma->t)++;
  p=p->next;
  }//while循环将Mat2中的元素全放入tma中,并与Mat1中相同脚标的相加
 for(a=0;a<=b;a++){
  r=(matrtype *)malloc(sizeof(matrtype));
  r->i=t[a]->i;  r->j=t[a]->j; r->e=t[a]->e; r->next=NULL;
  if(!(tma->matr)) {tma->matr=r;}
  else {h->next=r;}
  h=r;
  (tma->t)++;
  }//将t[]中剩余的元素也放入tma中
 printf("successful, input anykey show the sum ...");
 getch(); printf("/n");
 return tma;
 }

void main(){
table *ma=NULL,*mb=NULL,*sum=NULL;
 char menu;
int i;
textbackground(WHITE);  //设置文字颜色
//textcolor(RED); //设置文字颜色
clrscr(); //清屏
while(1){

printf("/n |");for(i=0;i<32;i++)printf("*");printf(" Main Menu ");for(i=0;i<33;i++)printf("*");printf("|/n");
for(i=0;i<30;i++) printf(" ");  printf("***  n/N: Create./n");
for(i=0;i<30;i++) printf(" ");  printf("***  s/S: Convert./n");
for(i=0;i<30;i++) printf(" ");  printf("***  p/P: Plus./n");
for(i=0;i<30;i++) printf(" ");  printf("***  c/C: Clear./n");
for(i=0;i<30;i++) printf(" ");  printf("***  q/Q: Quit./n");
printf(" |"); for(i=0;i<76;i++)printf("*");printf("|/n");
MENU:for(i=0;i<10;i++) printf(" ");  printf("Input command:");
  menu=getch();
  printf("%c/n",menu);
if(menu!='n'&&menu!='N'&&menu!='s'&&menu!='S'&&menu!='p'&&menu!='P'&&menu!='c'&&menu!='C'&&menu!='q'&&menu!='Q')
 {printf("command Error!/n"); goto MENU;}
 switch(menu){
  case 'n': case 'N':
    newmatr(&ma);
    printf("***ma:***/n");
    outmatr(ma); break;
  case 's': case 'S':
    printf("convert ma to mb:/n");
    mb=convert(ma);
    outmatr(mb); break;
  case 'p': case 'P':
    printf("/n/t/tDo you want to Create mb:/n/t/t/t/t y/Y: yes./t n/N: no/n");
    MENUP:for(i=0;i<10;i++) printf(" ");  printf("Input command:");
     menu=getch();
     printf("%c/n",menu);
    if(menu!='y'&&menu!='Y'&&menu!='n'&&menu!='N')
     {printf("command Error!/n"); goto MENUP;}
    if(menu=='y'||menu=='Y')
    {printf("Create another matrix mb:/n");
    newmatr(&mb);
    printf("***mb:***/n"); outmatr(mb);}
    sum=Matrixplus(ma,mb);
    printf("***Sum ma plus mb:***/n");
    outmatr(sum);  break;
  case 'q': case 'Q':  exit(1);
  case 'c': case 'C':;
    clrscr(); //清屏
  }
 }
}

原创粉丝点击