数据结构12————马鞍点问题&三元组稀疏矩阵&十字链表稀疏链表的加减法

数据结构12————马鞍点问题&三元组稀疏矩阵&十字链表稀疏链表的加减法

一.内容

  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[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中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值