三元组表示的矩阵求鞍点(C语言实现)
普通大学生,用最笨的方法求鞍点,忽略庞大时间复杂度,纯暴力检索,代码本来是为了存储稀疏矩阵的,里面也有快速转置的算法,在此基础上,写了求鞍点的方法,虽然很笨拙,但是也写出来了,有时间复杂度低的想法欢迎大家留言呀!
转载请附上原文链接
代码如下:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define Ok 1
#define Maxsize 10 //用户自定义三元组最大长度
typedef struct{ //定义三元组表
int i,j;
int v;
}TriTupleNode;
typedef struct{ //定义三元组表
TriTupleNode data[Maxsize];
int m;
int n;
int t; //矩阵行,列及三元组表长度
}TriTupleTable;
void paixu(TriTupleTable *a);
void InitTriTupleNode (TriTupleTable *a){ //输入三元组表
int i,j,k,val;
i=j=0;
k=1;
printf("请输入矩阵最大行数: ");
scanf("%d",&a->data[0].i);
printf("请输入矩阵最大列数: ");
scanf("%d",&a->data[0].j);
printf("请输入矩阵有效数字的个数: ");
scanf("%d",&a->data[0].v);
a->m=a->data[0].i;
a->n=a->data[0].j;
a->t=a->data[0].v;
while(k<=a->t&&i!=-1&&j!=-1){ //rol=-1||col=-1结束输入
Q: printf("输入矩阵元素的行: ");
scanf("%d",&i);
if(i>a->m){
printf("输入错误,请重新输入!\n");
goto Q;
}
else if(i==-1)
break;
W: printf("输入矩阵元素的列: ");
scanf("%d",&j);
if(j>a->n){
printf("输入错误,请重新输入!\n");
goto W;
}
else if(i==-1)
break;
printf("输入矩阵元素的值: ");
scanf("%d",&val);
a->data[k].i=i;
a->data[k].j=j;
a->data[k].v=val;
k++;
}
paixu(a);
}
void TransposeSMatrix(TriTupleTable *a, TriTupleTable *b)
{
int col,t,p,q;
int num[100],cpot[100];
b->data[0].i=a->data[0].j;
b->data[0].j=a->data[0].i;
b->data[0].v=a->data[0].v;
b->m=a->n;
b->n=a->m;
b->t=a->t;
if (b->t) {
for (col=1;col<=a->n;col++)
num[col] = 0;
for (t =1;t<=a->t;++t)
num[a->data[t].j]++;
cpot[1] =1;
for (col=2;col<=a->n;col++)
cpot[col] = cpot[col-1]+num[col-1];
for (p=1;p<=a->t;p++)
{
col=a->data[p].j;
q=cpot[col];
b->data[q].i=a->data[p].j;
b->data[q].j=a->data[p].i;
b->data[q].v=a->data[p].v;
cpot[col]++;
}
}
paixu(b);
}
void paixu(TriTupleTable *a){
int z,x,temp1,temp2,temp3;
for(z=0;z<a->t;z++)
for(x=1;x<a->t-z;x++)
{ if(a->data[x].i==a->data[x+1].i){
if(a->data[x].j>a->data[x+1].j){
temp1=a->data[x].i;
temp2=a->data[x].j;
temp3=a->data[x].v;
a->data[x].i=a->data[x+1].i;
a->data[x].j=a->data[x+1].j;
a->data[x].v=a->data[x+1].v;
a->data[x+1].i=temp1;
a->data[x+1].j=temp2;
a->data[x+1].v=temp3;
}
}
if(a->data[x].i>a->data[x+1].i){
temp1=a->data[x].i;
temp2=a->data[x].j;
temp3=a->data[x].v;
a->data[x].i=a->data[x+1].i;
a->data[x].j=a->data[x+1].j;
a->data[x].v=a->data[x+1].v;
a->data[x+1].i=temp1;
a->data[x+1].j=temp2;
a->data[x+1].v=temp3;
}
}
}
void showMatrix(TriTupleTable *a){ //输出稀疏矩阵
int p,q;
int t=1;
for(p=1;p<=a->m;p++){
for(q=1;q<=a->n;q++){
if(a->data[t].i==p&&a->data[t].j==q){
printf("%d\t",a->data[t].v);
t++;
}
else
printf("0\t");
}
printf("\n");
}
}
void shuchu(TriTupleTable *a){
printf("\n");
for(int k=1;k<= a->t;k++){
printf("%d\t%d\t%d\n",a->data[k].i,a->data[k].j,a->data[k].v);
}
}
void find(TriTupleTable *a)
{
TriTupleTable *b,*c,*d;
int q=1,t1,t2,t3,z,x;
b=(TriTupleTable*)malloc(sizeof(TriTupleTable));
c=(TriTupleTable*)malloc(sizeof(TriTupleTable));
d=(TriTupleTable*)malloc(sizeof(TriTupleTable));
c->t=0;
d->t=0;
c->data[q].v=999;
for(int k=1;k<= a->t;k++){
if(k+1>a->t) break;
for(;a->data[k].i == a->data[k+1].i;k++)
{
if(k+1>a->t) break;
if(a->data[k].v < a->data[k+1].v){
c->data[q].i=a->data[k].i;
c->data[q].j=a->data[k].j;
c->data[q].v=a->data[k].v;
t1=a->data[k].v;
a->data[k].v = a->data[k+1].v;
a->data[k+1].v=t1;
t2=a->data[k].i;
a->data[k].i =a->data[k+1].i;
a->data[k+1].i=t2;
t3=a->data[k].j;
a->data[k].j = a->data[k+1].j;
a->data[k+1].j=t3;
}
else{
c->data[q].i=a->data[k+1].i;
c->data[q].j=a->data[k+1].j;
c->data[q].v=a->data[k+1].v;
}
}
q++;
c->t++;
}
TransposeSMatrix(a,b);
q=1;
for(int k=1;k<= b->t;k++){
if(k+1>b->t) break;
for(;b->data[k].i == b->data[k+1].i;k++)
{
if(k+1>b->t) break;
if(b->data[k].v > b->data[k+1].v){
d->data[q].i=b->data[k].i;
d->data[q].j=b->data[k].j;
d->data[q].v=b->data[k].v;
t1=b->data[k].v;
b->data[k].v = b->data[k+1].v;
b->data[k+1].v=t1;
t2=b->data[k].i;
b->data[k].i = b->data[k+1].i;
b->data[k+1].i=t2;
t3=b->data[k].j;
b->data[k].j = b->data[k+1].j;
b->data[k+1].j=t3;
}
else{
d->data[q].i=b->data[k+1].i;
d->data[q].j=b->data[k+1].j;
d->data[q].v=b->data[k+1].v;
}
}
q++;
d->t++;
}
for(z=1;z<=c->t;z++)
for(x=1;x<=c->t;x++)
if(c->data[z].i==d->data[x].j)
if(c->data[z].j==d->data[x].i&&c->data[z].v==d->data[x].v) {
printf("鞍点的信息如下:第%d行 第%d列 值为%d",c->data[z].i,c->data[z].j,c->data[z].v);
goto A;
}
A: printf("\n");
if(z>c->t) printf("没有找到鞍点!");
}
int main(){
TriTupleTable *a,*b;
a=(TriTupleTable*)malloc(sizeof(TriTupleTable));
b=(TriTupleTable*)malloc(sizeof(TriTupleTable));
InitTriTupleNode(a);
printf("\n生成的矩阵如下:\n");
showMatrix(a);
find(a);
return 0;
}
测试数据如下:
3
3
9
1
1
1
1
2
2
1
3
5
2
1
3
2
2
4
2
3
6
3
1
5
3
2
6
3
3
7
结果如下: