数据结构9————马鞍点问题&三元组稀疏矩阵&十字链表稀疏链表的加减法
2017-11-10 16:18
399 查看
数据结构9————马鞍点问题&三元组稀疏矩阵&十字链表稀疏链表的加减法
一.内容
1.马鞍点问题
2.三元组稀疏矩阵的加减法
3.十字链表稀疏矩阵的加减法
二.求矩阵的马鞍点
1.问题描述
2.思路
求出每一行的最小值,存到minrows数组中求出每一列的最大值,存到maxcols数组中
寻找是否存在i和j,使minrows[i]==maxcols[j],如果存在a[i][j]就是马鞍点,否则不存在。
3.代码
#include <stdio.h> #define MAX 50 int main(void){ int i,j; int a[MAX][MAX]; int rows,cols; int minrows[MAX],maxcols[MAX];//存储这一行最小和这一行最大值 int flag=0; scanf("%d%d",&rows,&cols); for(i=0;i<rows;i++){ for(j=0;j<cols;j++){ scanf("%d",&a[i][j]); } } for(i=0;i<rows;i++){ minrows[i]=a[i][0]; for(j=1;j<cols;j++){ if(minrows[i]>a[i][j]) minrows 4000 [i]=a[i][j]; } } for(j=0;j<cols;j++){ maxcols[j]=a[0][j]; for(i=0;i<rows;i++){ if(maxcols[j]<a[i][j]) maxcols[j]=a[i][j]; } } for(i=0;i<rows;i++){ for(j=0;j<cols;j++){ if(minrows[i]==maxcols[j]) { printf("(%d,%d,%d)",i+1,j+1,a[i][j]); flag=1; } } } if(flag==0){ printf("NONE"); } }
三.三元组稀疏矩阵的加减法
1.问题描述
2.代码
#include <stdio.h> #define MAXSIZE 100 typedef int ElementType; typedef struct{ int row,col; //row行号,col列号 ElementType value; }Triple; typedef struct{ Triple data[MAXSIZE+1]; int rows,clos,nums; //rows稀疏矩阵的行数,clos稀疏矩阵的列数,nues非0原的个数 }TSMatrix; TSMatrix *Creation(){ //创建 TSMatrix *TS; Triple Tr; char c; TS = (TSMatrix *)malloc(sizeof(TSMatrix)); scanf("%d%d%d",&TS->rows,&TS->clos,&TS->nums); int i; getchar();;//这句是为了应付学校的acm for(i=0;i<TS->nums;i++){ scanf("%c%d%c%d%c%d%c",&c,&Tr.row,&c,&Tr.col,&c,&Tr.value,&c); TS->data[i]=Tr; } return TS; } void Output(TSMatrix *TS){ //输出 int i; printf("%d %d %d\n",TS->rows,TS->clos,TS->nums); for(i=0;i<TS->nums;i++){ printf("(%d,%d,%d)",TS->data[i].row,TS->data[i].col,TS->data[i].value); } printf("\n"); } TSMatrix *Add(TSMatrix *TS1,TSMatrix *TS2){ //加法 int i=0,j=0; TSMatrix *TS3; Triple Tr; TS3 = (TSMatrix *)malloc(sizeof(TSMatrix)); TS3->nums=0; while(i<TS1->nums&&j<TS2->nums){ if(TS1->data[i].row<TS2->data[j].row){ //TS1行号小于TS2 Tr=TS1->data[i]; i++; }else if(TS1->data[i].row>TS2->data[j].row){ //TS1行号大于TS2 Tr=TS2->data[j]; j++; }else if(TS1->data[i].col<TS2->data[j].col){ //TS1行号等于TS2 TS1列号小于TS2 Tr=TS1->data[i]; i++; }else if(TS1->data[i].col>TS2->data[j].col){ //TS1行号等于TS2 TS1列号大于TS2 Tr=TS2->data[j]; j++; }else { //TS1行号列号等于TS2 ,即相加 Tr=TS1->data[i]; Tr.value= TS1->data[i].value+TS2->data[j].value; i++; j++; } if(Tr.value !=0){ TS3->data[TS3->nums]=Tr; TS3->nums++; } } while(i<TS1->nums){ TS3->data[TS3->nums]=TS1->data[i]; i++;TS3->nums++; } while(j<TS2->nums){ TS3->data[TS3->nums]=TS2->data[j]; j++;TS3->nums++; } TS3->rows=TS2->rows; TS3->clos=TS2->clos; return TS3; } TSMatrix *Sub(TSMatrix *TS1,TSMatrix *TS2){ //减法 int i=0,j=0,t; TSMatrix *TS3; Triple Tr; TS3 = (TSMatrix *)malloc(sizeof(TSMatrix)); TS3->nums=0; while(i<TS1->nums&&j<TS2->nums){ if(TS1->data[i].row<TS2->data[j].row){ //TS1行号小于TS2 Tr=TS1->data[i]; i++; }else if(TS1->data[i].row>TS2->data[j].row){ //TS1行号大于TS2 Tr=TS2->data[j]; Tr.value=-Tr.value; j++; }else if(TS1->data[i].col<TS2->data[j].col){ //TS1行号等于TS2 TS1列号小于TS2 Tr=TS1->data[i]; i++; }else if(TS1->data[i].col>TS2->data[j].col){ //TS1行号等于TS2 TS1列号大于TS2 Tr=TS2->data[j]; Tr.value=-Tr.value; j++; }else { Tr=TS1->data[i]; //TS1行号列号等于TS2 Tr.value=TS1->data[i].value - TS2->data[j].value; i++;j++; } if(Tr.value!=0){ TS3->data[TS3->nums]=Tr; TS3->nums++; } } while(i<TS1->nums){ TS3->data[TS3->nums]=TS1->data[i]; i++;TS3->nums++; } while(j<TS2->nums){ Tr=TS2->data[j]; Tr.value=-TS2->data[j].value; TS3->data[TS3->nums]=Tr; j++;TS3->nums++; } TS3->rows=TS2->rows; TS3->clos=TS2->clos; return TS3; } int main(void){ TSMatrix *TS1; TSMatrix *TS2; TSMatrix *TS3; TSMatrix *TS4; TS1=Creation(); TS2=Creation(); TS3=Add(TS1,TS2); TS4=Sub(TS1,TS2); Output(TS3); Output(TS4); }
四.十字链表稀疏矩阵的加减法
1.问题描述
2.代码
#include <stdio.h> #include <stdlib.h> #define MAX 50 typedef int Elemtype; typedef struct OLnode{ int row,col; Elemtype value; struct OLnode *right,*down; }OLNode,*OLink; typedef struct { OLink rowhead[MAX],colhead[MAX]; int rows,cols,nums; }CrosList; void Insert(CrosList *CL,OLNode *node){ //插入 OLNode *p; node->right=NULL; node->down=NULL; //插入到行中 if(CL->rowhead[node->row-1]==NULL) CL->rowhead[node->row-1]=node; else{ //插入到行链里 p=CL->rowhead[node->row-1]; while(p->right&&node->row > p->right->row){ p=p->right; }; node->right=p->right; p->right=node; } if(CL->colhead[node->col-1]==NULL) CL->colhead[node->col-1]=node; else{ //插入到列链中 p=CL->colhead[node->col-1]; while(p->down&&node->col > p->down->col){ p=p->down; }; node->down=p->down; p->down=node; } } CrosList *Creation(){ //创建 CrosList *CL; OLNode *node; OLNode *p; CL = (CrosList *)malloc(sizeof(CrosList)); scanf("%d%d%d",&CL->rows,&CL->cols,&CL->nums); int i; for(i=0;i<CL->rows;i++) CL->rowhead[i]=NULL; for(i=0;i<CL->cols;i++) CL->colhead[i]=NULL; getchar(); for(i=0;i<CL->nums;i++){ node = (OLNode*)malloc(sizeof(OLNode)); scanf("(%d,%d,%d)",&node->row,&node->col,&node->value); Insert(CL,node); //插入 } return CL; } void Output(CrosList *CL){ //输出 int i; OLNode *node; if(CL==NULL) return; printf("%d %d %d\n",CL->rows,CL->cols,CL->nums); for(i=0;i<CL->rows;i++){ node = CL->rowhead[i]; while(node){ printf("(%d,%d,%d)",node->row,node->col,node->value); node=node->right; } } printf("\n"); /*printf("%d %d %d",CL->rows,CL->cols,CL->nums); //列优先输出 for(i=0;i<CL->cols;i++){ node = CL->colhead[i]; while(node){ printf("(%d,%d,%d)",node->row,node->col,node->value); node=node->down; } } printf("\n");*/ } int Inquire (CrosList *CL,OLNode *node){ //查询该位置是否有元素 int i=node->row; int j=node->col; OLNode *p; if(CL->rowhead[i]==NULL||CL->colhead[j]==NULL) return 0; p=CL->rowhead[i]; while(p&&p->row!=node->row&&p->col!=node->col){ p=p->right; } if(p->row==node->row && p->col==node->col) return 1; return 0; } CrosList *ADD(CrosList *CL1,CrosList *CL2){ OLNode *pi,*pj,*pk; int i; CrosList *CL3; CL3 = (CrosList *)malloc(sizeof(CrosList)); CL3->rows=CL1->rows; CL3->cols=CL2->cols; CL3->nums=0; for(i=0;i<CL3->rows;i++)//初始化 CL3->rowhead[i]=NULL; for(i=0;i<CL3->cols;i++) CL3->colhead[i]=NULL; for(i=0;i<CL1->rows;i++){ pi = CL1->rowhead[i]; pj = CL2->rowhead[i]; while(pi&&pj){ pk=(OLNode*)malloc(sizeof(OLNode)); if(pi->row < pj->row){ //CL1行号小于CL2 pk->row=pi->row; pk->col=pi->col; pk->value=pi->value; pi=pi->right; }else if(pi->row > pj->row){ //CL1行号大于CL2 pk->row=pj->row; pk->col=pj->col; pk->value=pj->value; pj=pj->right; }else if(pi->col < pj->col ){ //CL1行号等于Cl2 Cl1列号小于Cl2 pk->row=pi->row; pk->col=pi->col; pk->value=pi->value; pi=pi->right; }else if(pi->col > pj->col ){ //CL行号等于CL2 Cl1列号大于Cl2 pk->row=pj->row; pk->col=pj->col; pk->value=pj->value; pj=pj->right; }else{ //CL1行号列号等于CL2 ,即相加 pk->row=pi->row; pk->col=pi->col; pk->value=pi->value+pj->value; pi=pi->right; pj=pj->right; } if(pk->value!=0){ Insert(CL3,pk);//插入 CL3->nums++; } } while(pi){ pk=(OLNode*)malloc(sizeof(OLNode)); pk->row=pi->row; pk->col=pi->col; pk->value=pi->value; pi=pi->right; Insert(CL3,pk);//插入 CL3->nums++; } while(pj){ pk=(OLNode*)malloc(sizeof(OLNode)); pk->row=pj->row; pk->col=pj->col; pk->value=pj->value; pj=pj->right; Insert(CL3,pk);//插入 CL3->nums++; } } return CL3; } CrosList *Sub(CrosList *CL1,CrosList *CL2){ OLNode *pi,*pj,*pk; int i; CrosList *CL4; CL4 = (CrosList *)malloc(sizeof(CrosList)); CL4->rows=CL1->rows; CL4->cols=CL2->cols; CL4->nums=0; for(i=0;i<CL4->rows;i++)//初始化 CL4->rowhead[i]=NULL; for(i=0;i<CL4->cols;i++) CL4->colhead[i]=NULL; for(i=0;i<CL1->rows;i++){ pi = CL1->rowhead[i]; pj = CL2->rowhead[i]; while(pi&&pj){ pk=(OLNode*)malloc(sizeof(OLNode)); if(pi->row < pj->row){ //CL1行号小于CL2 pk->row=pi->row; pk->col=pi->col; pk->value=pi->value; pi=pi->right; }else if(pi->row > pj->row){ //CL1行号大于CL2 pk->row=pj->row; pk->col=pj->col; pk->value=-pj->value; pj=pj->right; }else if(pi->col < pj->col ){ //CL1行号等于Cl2 Cl1列号小于Cl2 pk->row=pi->row; pk->col=pi->col; pk->value=pi->value; pi=pi->right; }else if(pi->col > pj->col ){ //CL行号等于CL2 Cl1列号大于Cl2 pk->row=pj->row; pk->col=pj->col; pk->value=-pj->value; pj=pj->right; }else{ //CL1行号列号等于CL2 ,即相加 pk->row=pi->row; pk->col=pi->col; pk->value=pi->value-pj->value; pi=pi->right; pj=pj->right; } if(pk->value!=0){ Insert(CL4,pk);//插入 CL4->nums++; } } while(pi){ pk=(OLNode*)malloc(sizeof(OLNode)); pk->row=pi->row; pk->col=pi->col; pk->value=pi->value; pi=pi->right; Insert(CL4,pk);//插入 CL4->nums++; } while(pj){ pk=(OLNode*)malloc(sizeof(OLNode)); pk->row=pj->row; pk->col=pj->col; pk->value=- pj->value; pj=pj->right; Insert(CL4,pk);//插入 CL4->nums++; } } return CL4; } int main(void){ CrosList *CL1=NULL; CrosList *CL2=NULL; CrosList *CL3=NULL; CrosList *CL4=NULL; CL1=Creation(); CL2=Creation(); CL3=ADD(CL1,CL2); CL4=Sub(CL1,CL2); Output(CL3); Output(CL4); }
五.源代码
test11中相关文章推荐
- 数据结构(二):线性表的使用原则以及链表的应用-稀疏矩阵的三元组表示
- 数据结构学习笔记(二) 链表之用循环链表解决约瑟夫问题
- 数据结构八:稀疏矩阵(涉及三元组,十字链表)
- 每日一刷——1.判断两个链表是否相交,若相交求交点(链表不带环&带环)2.fork()问题
- javascript实现数据结构: 稀疏矩阵之三元组线性表表示
- 数据结构-稀疏矩阵(三元组表示)
- ytu 2231: 交集问题(线性表)(数据结构,链表练习)
- 【郝斌数据结构自学笔记】16-23_链表的定义与分类_链表节点插入与删除_每一个链表节点的数据类型该如何表示的问题
- 十字链表 稀疏矩阵的数据结构
- 数据结构--单链表“环"的问题(2)
- 矩阵的压缩存储(稀疏矩阵的十字链表存储、稀疏矩阵的三元组行逻辑链接的顺序表存储表示、稀疏矩阵的三元组顺序表存储表示)
- 学生信息管理系统-顺序表&&链表(数据结构第一次作业)
- "c++ list", c++链表遇上的问题
- C语言数据结构之单向链表(已经调试可以实现相应的功能了,可是还是有几个问题现在还是不大理解,希望大家能够一起探讨)
- c语言数据结构之单向循环链表约瑟夫问题
- c语言版数据结构(奇迹冬瓜)-数组和广义表(十字链表存贮稀疏矩阵的行列值)
- 数据结构 循环链表之约瑟夫问题
- 第九周 数据结构实践项目——数组和广义表【项目3.1-稀疏矩阵的三元组表示的实现及应用】
- 数据结构学习的简单问题(三):用链表实现多项式相加
- 数据结构模版----单链表SimpleLinkList[不带头结点&&伪OO](C语言实现)