数据结构实验
来源:互联网 发布:淘宝批量上传宝贝教程 编辑:程序博客网 时间: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(); //清屏
}
}
}
- 数据结构实验
- 数据结构实验
- 数据结构实验
- 《数据结构》实验一 实验报告
- 数据结构 实验一实验报告
- 数据结构实验一 实验报告
- 《数据结构》:实验 线性表实验
- 实验报告--数据结构实验一
- 数据结构实验一(实验报告)
- 《数据结构实验一》实验报告
- 数据结构实验2
- 再做数据结构实验
- 数据结构实验的代码
- 数据结构实验4
- 数据结构实验--约瑟夫环
- 数据结构实验--电子通讯录
- 《数据结构》实验报告
- 《数据结构》实验报告
- kokia-ありがとう 送给csdn的 :) 感谢csdn在09年给我的许许多多帮助
- 2009年总结
- JavaScript模拟用户单击事件
- 去除桌面盘符显示
- 用VB实现带图片的XP风格的按钮控件
- 数据结构实验
- jsp在线编辑器|PHP在线编辑器|asp在线编辑器|.net在线编辑器|asp.net在线编辑器|在线Word编辑器
- 自己收集的好用的日期插件
- 对内存有了进一步理解!
- PHP在线编辑器
- DBGridEH根据某一字段不同值显示不同的行颜色
- JSP在线编辑器
- velocit日志
- TAB各页面的编写及窗口自动缩放