实验四 数组和广义表

练习题10:设计一个算法,计算一个用三元组表表示的稀疏矩阵的对角线元素之和。

#include <iostream>
#include "malloc.h"
#include <iomanip>
using namespace std;

typedef struct
{
	int r;
	int c;
	int d;
}TupNode;
typedef struct
{
	int rows;
	int cols;
	int nums;
	TupNode data[16];
}TSMatrix;

void CreatMat(TSMatrix &t,int A[4][4])//从某个二位稀疏矩阵创建其三元组表示 
{
	int i,j;
	t.rows=4;t.cols=4;t.nums=0;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			if(A[i][j]!=0)
			{
				t.data[t.nums].r=i;t.data[t.nums].c=j;
				t.data[t.nums].d=A[i][j];t.nums++;
			}
		}
	}
}

bool Value(TSMatrix &t,int x,int i,int j)//三元组元素的赋值 
{
	int k=0,k1;
	if(i>t.rows||j>=t.cols)
	    return false;
    while(k<t.nums&&i>t.data[k].r) k++;
    while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c) k++;
    if(t.data[k].r==i&&t.data[k].c==j)
        t.data[k].d=x;
    else
    {
    	for(k1=t.nums-1;k1>=k;k1--)
    	{
	    	t.data[k1+1].r=t.data[k1].r;
	    	t.data[k1+1].c=t.data[k1].c;
	    	t.data[k1+1].d=t.data[k1].d;
	    }
	    t.data[k].r=i;t.data[k].c=j;t.data[k].d=x;
	    t.nums++;
    }
    return true;
}

bool Assign(TSMatrix t,int &x,int i,int j)//将指定位置的元素值赋给变量 
{
	int k=0;
	if(i>=t.rows||j>=t.cols)
	    return false;
    while(k<t.nums&&i>t.data[k].r) k++;
    while(k<t.nums&&i==t.data[k].r&&j>t.data[k].c) k++;
    if(t.data[k].r==i&&t.data[k].c==j)
        x=t.data[k].d;
    else x=0;
    return true;
}

void DispMat(TSMatrix t)//输出三元组 
{
	int k;
	if(t.nums<=0)
	    return;
    for(k=0;k<t.nums;k++)
    {
    	cout<<setw(4)<<t.data[k].d;
    	if((k+1)%4==0)
    	    cout<<endl;
    }
}

bool text10(TSMatrix a,int &sum)
{
    sum=0;
    if (a.rows!=a.cols) //行号不等于列号,返回 false
    {
	    printf("不是对角矩阵\n");
        return false;
    }
    for (int i=0;i<a.nums;i++)
        if (a.data[i].r==a.data[i].c) //行号等于列号
            sum+=a.data[i].d;
    return true;
}

int main()
{
	int test1[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
	int sum=0;
	TSMatrix test2;
	CreatMat(test2,test1);
	DispMat(test2);
	text10(test2,sum);
	cout<<"对角线元素和为:"<<sum<<endl;
}

实验题3:以下是一个55阶螺旋方阵,编写一个程序,输出该形式的nn(n<10)阶方阵(按顺时针方向旋进)。
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

#include <iostream>
#include <iomanip>
using namespace std;

void text3(int a[10][10],int n)
{
	int i,j,k=0,m;
	if(n%2==0) m=n/2;
	else m=n/2+1;
	for(i=0;i<m;i++)
	{
		for(j=i;j<n-i;j++)
		{
			k++;
			a[i][j]=k;
		}
		for(j=i+1;j<n-i;j++)
		{
			k++;
			a[j][n-i-1]=k;
		}
		for(j=n-i-2;j>=i;j--)
		{
			k++;
			a[n-i-1][j]=k;
		}
		for(j=n-i-2;j>=i+1;j--)
		{
			k++;
			a[j][i]=k;
		}
	}
}

int main()
{
	int n,i,j;
	int a[10][10];
	cout<<"请输入n(n<10):";
	cin>>n;
	text3(a,n);
	cout<<"n阶数字方阵如下:"<<endl;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		    cout<<setw(4)<<a[i][j];
        cout<<endl;
	}
}

实验题4:如果矩阵A中存在一个元素满足以下条件,即A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。设计一个程序,计算出m*n的矩阵A的所有马鞍点。

#include <iostream>
#include <iomanip>
using namespace std;

void test4(int a[4][4])
{
	int i,j;
	bool have=false;
	int min[4],max[4];
	for(i=0;i<4;i++)
	{
		min[i]=a[i][0];
		for(j=1;j<4;j++)
		{
			if(a[i][j]<min[i])
			    min[i]=a[i][j];
		}
	}
	for(j=0;j<4;j++)
	{
	    max[j]=a[0][j];
	    for(i=1;i<4;i++)
		{
			if(a[i][j]>max[j])
			    max[j]=a[i][j];
		}
	}
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			if(min[i]==max[j])
			{
				cout<<"马鞍点为:"<<"["<<i+1<<"]"<<"["<<j+1<<"]="<<a[i][j]<<endl;
				have=true;
			}
		}
	}
	if(!have)
	    cout<<"无马鞍点。"<<endl; 
}

int main()
{
	int i,j;
	int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
	cout<<"矩阵为:"<<endl;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		    cout<<setw(4)<<a[i][j];
        cout<<endl;
	}
	test4(a);
}

仅作留档。

发布了30 篇原创文章 · 获赞 12 · 访问量 880

猜你喜欢

转载自blog.csdn.net/weixin_43893854/article/details/104326247