您的位置:首页 > 理论基础 > 数据结构算法

数据结构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中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐