稀疏矩阵(三元组顺序表存储)6种操作的实现

/*   数据结构分析与学习专栏
*   Copyright (c) 2015, 山东大学 计算机科学与技术专业 学生
*   All rights reserved.
*   作    者:   高祥
*   完成日期:  2015 年 4 月 9 日
*   版 本 号:015

*任务描述:针对稀疏矩阵,实现10个基本操作
*   1:建立稀疏矩阵 ;
*   2:输出稀疏矩阵 ;
*   3:转置稀疏矩阵 ;
*   4:稀疏矩阵相加 ;
*   5:稀疏矩阵相减;
*   6:稀疏矩阵相乘 ;


*主要函数:
*   1.void CreateMatrix(Matrix &M);//创建矩阵
*   2.void Output(Matrix M);//输出矩阵
*   3.void TransposeMatrix1(Matrix &M);//转置矩阵算法1
*   4.void TransposeMatrix2(Matrix &M);//转置矩阵算法2
*   5.void TransposeMatrix3(Matrix &M);//转置矩阵算法3
*   6.void AddMatrix(Matrix &M1,Matrix &M2);//矩阵相加
*   7.void SubtractMatrix(Matrix &M1,Matrix &M2);//矩阵相减
*   8.void MultiplyMatrix(Matrix &M,Matrix &N);//矩阵相乘
*   9.Status Check(Matrix M,int index,int row,int line);//检查矩阵M的数组data中第index个元素的行列数
*   10.void SortByRow(Matrix &M);//行优先冒泡排序
*   11.void SortByLine(Matrix &M);//列优先冒泡排序

*/
#include
#include
#include
#include
using namespace std;

#define OK 1
#define FALSE 0
#define MAXSIZE 10000

typedef int ElemType;
typedef int Status;

typedef struct
{
    int row;//非零元素所在的行
    int line;//非零元素所在的列
    ElemType elem;//非零元素大小
} Triple;//非零元素的三元组类型

typedef struct
{
    Triple data[MAXSIZE];//非零元素数组
    int rownum;//矩阵的行数
    int linenum;//矩阵的列数
    int elemnum;//矩阵的非零元素总数
} Matrix;//矩阵类型

void CreateMatrix(Matrix &M);//创建矩阵
void Output(Matrix M);//输出矩阵
void TransposeMatrix1(Matrix &M);//转置矩阵算法1
void TransposeMatrix2(Matrix &M);//转置矩阵算法2
void TransposeMatrix3(Matrix &M);//转置矩阵算法3
void AddMatrix(Matrix &M1,Matrix &M2);//矩阵相加
void SubtractMatrix(Matrix &M1,Matrix &M2);//矩阵相减
void MultiplyMatrix(Matrix &M,Matrix &N);//矩阵相乘
Status Check(Matrix M,int index,int row,int line);//检查矩阵M的数组data中第index个元素的行列数
void SortByRow(Matrix &M);//行优先冒泡排序
void SortByLine(Matrix &M);//列优先冒泡排序
void Interaction();//输出操作

int main()
{
    Interaction();

    Matrix M,N;
    int operate;
    while(cin>>operate)
    {
        switch(operate)
        {
        case 0:
            return 0;

        case 1:
            cout<<"请输入创建的稀疏矩阵的行数、列数、非0元素个数:";
            cin>>M.rownum>>M.linenum>>M.elemnum;
            CreateMatrix(M);
            break;

        case 2:
            Output(M);
            break;

        case 3:
            cout<<"转置矩阵共3种方法,请输入使用的方法序号(1/2/3):";
            cin>>operate;

            switch(operate)
            {
            case 1:
                TransposeMatrix1(M);
                break;

            case 2:
                TransposeMatrix2(M);
                break;

            case 3:
                TransposeMatrix3(M);
                break;
            }
            break;

        case 4:
INPUT1:
            cout<<"请输入创建的稀疏矩阵的行数、列数、非0元素个数:";
            cin>>N.rownum>>N.linenum>>N.elemnum;
            if(M.rownum!=N.rownum||M.linenum!=N.linenum)
            {
                cout<<"矩阵相加的前提是两个矩阵的行数列数分别相等。请创建合法的矩阵。\n";
                goto INPUT1;
            }

            CreateMatrix(N);
            AddMatrix(M,N);
            break;

        case 5:
INPUT2:
            cout<<"请输入创建的稀疏矩阵的行数、列数、非0元素个数:";
            cin>>N.rownum>>N.linenum>>N.elemnum;
            if(M.rownum!=N.rownum||M.linenum!=N.linenum)
            {
                cout<<"矩阵相减的前提是两个矩阵的行数列数分别相等。请创建合法的矩阵。\n";
                goto INPUT2;
            }

            CreateMatrix(N);
            SubtractMatrix(M,N);
            break;

        case 6:
INPUT3:
            cout<<"请输入创建的稀疏矩阵的行数、列数、非0元素个数:";
            cin>>N.rownum>>N.linenum>>N.elemnum;
            if(M.linenum!=N.rownum)
            {
                cout<<"矩阵相乘的前提是矩阵1的列数等于矩阵2的行数。请创建合法的矩阵。\n";
                goto INPUT3;
            }

            CreateMatrix(N);
            MultiplyMatrix(M,N);
            break;
        default:
            cout<<"请输入正确的操作数字!\n";
        }
    }
    return 0;
}

void CreateMatrix(Matrix &M)//创建矩阵
{
    cout<<"请输入"<>M.data[i].row>>M.data[i].line>>M.data[i].elem;
    }

    SortByRow(M);//将矩阵的所有非零元素按照行优先的顺序重新排列,便于后续操作
    cout<<"创建的稀疏矩阵为:\n";
    Output(M);
}

void Output(Matrix M)//输出矩阵
{
    int index=1;
    for(int row=1; row<=M.rownum; row++)
    {
        for(int line=1; line<=M.linenum; line++)
        {
            if(Check(M,index,row,line))//检测当前位置是否是非零元素
            {
                cout<M.data[j].row||(M.data[i].row==M.data[j].row&&M.data[i].line>M.data[j].line))
                {
                    swap(M.data[i],M.data[j]);
                }
            }
        }
    }
}

void SortByLine(Matrix &M)//列优先冒泡排序
{
    if(M.elemnum)
    {
        for(int i=1; i<=M.elemnum; i++)
        {
            for(int j=i+1; j<=M.elemnum; j++)
            {
                if(M.data[i].line>M.data[j].line||(M.data[i].line==M.data[j].line&&M.data[i].row>M.data[j].row))
                {
                    swap(M.data[i],M.data[j]);
                }
            }
        }
    }
}

void Interaction()//输出操作
{
    cout<<"请输入对应操作的序号:\n";
    cout<<"0:退出程序 ;\n";
    cout<<"1:建立稀疏矩阵 ;\n";
    cout<<"2:输出稀疏矩阵 ;\n";
    cout<<"3:转置稀疏矩阵 ;\n";
    cout<<"4:稀疏矩阵相加 ;\n";
    cout<<"5:稀疏矩阵相减;\n";
    cout<<"6:稀疏矩阵相乘 ;\n";
}

你可能感兴趣的:(稀疏矩阵(三元组顺序表存储)6种操作的实现)