广东工业大学 数据结构实验报告 题目: 稀疏矩阵

本文详细介绍了广东工业大学数据结构实验中关于稀疏矩阵的抽象数据类型定义,包括创建、销毁、打印、复制、加减乘运算等基本操作。实验采用三元组顺序表存储稀疏矩阵,通过冒泡排序保持三元组有序。同时,文章提供了完整的C语言代码实现,涵盖了矩阵的输入、输出、查找、插入、删除、转置等操作。
摘要由CSDN通过智能技术生成

广东工业大学数据结构实验报告         

  题目: 稀疏矩阵 

1.题目: 抽象数据类型稀疏矩阵     ADT 定义如下:

      ADT  SparseMatrix{ 

     数据对象:D={aij| i=1,2,...,m; j=1,2,...,n; 

               aij∈ElemSet, m 和n分别称为矩阵的行数和列数}    

    数据关系:R={Row,Col} 

              Row={<ai,j,ai,j+1>| 1<=i<=m,1<=j<=n-1} 

       Col={<ai,j,ai,j+1> | 1<=i<=m-1,1<=j<=n} 

     基本操作:

      Status CreateSMatrix(TSMatrix &M) 

          操作结果:创建稀疏矩阵M 

         Status DestroySMatrix(TSMatrix &M) 

          初始条件:稀疏矩阵M已经存在 

          操作结果:销毁矩阵M 

      void PrintSMatrix(TSMatrix M) 

          初始条件:稀疏矩阵M已经存在 

                操作结果:打印矩阵M

      Status CopySMatrix(TSMatrix M, TSMatrix &T) 

          初始条件:稀疏矩阵M已经存在 

          操作结果:复制矩阵M到T 

      Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q) 

          初始条件:稀疏数组M、N的行数和列数对应相等 

          操作结果:求矩阵的和Q=M+N 

      Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q) 

          初始条件:稀疏数组M、N的行数和列数对应相等 

          操作结果:求矩阵的差Q=M-N 

      Status TransposeSMatrix(TSMatrix M, TSMatrix & T) 

          初始条件:稀疏数组M已经存在 

          操作结果:求矩阵M的转置T 

      Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q) 

         初始条件:稀疏数组M的列数等于N的行数

                 操作结果:求矩阵的积Q=M*N 

         StatusFindElem(TSMatrix M, int row, int col, ElemType &e)

                     初始条件:稀疏数组M存在

                 操作结果:查找第row行,第col列元素,若不为0则用e返回其值 

         StatusInsertElem(TSMatrix &M, int row, int col, ElemType e)

                     初始条件:稀疏数组M存在

                 操作结果:在第row行,第col列位置插入元素e 

         StatusDeleteElem(TSMatrix &M, int row, int col, ElemType &e)

                     初始条件:稀疏数组M存在

                 操作结果:删除第row行,第col列元素 

         StatusIsEmptyMatrix(TSMatrix M)

                 操作结果:判断是否为空矩阵

       }ADT SparseMatrix

2.存储结构定义

    稀疏矩阵的三元组顺序表存储表示 

       #define MAXSIZE 50

       typedef struct {

            int i, j;

           ElemType e;

       }Triple;

       typedef struct {

          Tripledata[MAXSIZE+1];                   

       intmu, nu, tu;

       }TSMatrix;

 

3. 算法设计

#include<stdio.h>

#include<stdlib.h>

#define TRUE 1;

#define FALSE 0;

#define OK 1

#define ERROR 0;

typedef intStatus;

typedef intElemType;                                                                       

/*  稀疏矩阵的三元组顺序表存储表示  */

#define MAXSIZE 50

typedef struct {

    int i, j;

    ElemType e;

}Triple;

typedef struct {

    Triple data[MAXSIZE+1];            //这里可用数组实现也可用指针实现

    int mu, nu, tu;

}TSMatrix;

//对三元组表示的稀疏矩阵进行排序

                      //需要排序是因为创建三元组时可以任意不按顺序输入

voidOrder(TSMatrix &M){

    int a, b;

    Triple t;

    for(a=1; a<M.tu; a++){                       //冒泡排序

        for(b=a+1; b<M.tu+1; b++){

            if(M.data[a].i > M.data[b].i){        //如果前面一个行号比后面一                                                                                      //个行号大,就交换

                t = M.data[a];

                M.data[a] = M.data[b];

                M.data[b] = t;

            }

            if(M.data[a].i ==M.data[b].i){        //行号相等,列号大的在后面

                if(M.data[a].j >M.data[b].j){

                    t = M.data[a];

                    M.data[a] = M.data[b];

                    M.data[b] = t;

                }   

            }

        }     

    }          

}

//销毁稀疏矩阵M 

StatusDestroySMatrix(TSMatrix &M){         //要想销毁一个三元组表示的                                                                                          //矩阵就必须销毁四部分

    int num = M.tu;                          //M.mu,M.nu,M.tu和M.data[]

    M.mu = 0;

    M.nu = 0;

    M.tu = 0;

    for(int k=1; k<=num; k++){            //因为用数组实现,又数组为静                                                                 // 态分配,故销毁数组只能置其内容为0

        M.data[k].i = 0;             // 而不能释放其空间

        M.data[k].j = 0;

        M.data[k].e = 0;

    }

    return OK;

}        

//创建稀疏矩阵M

StatusCreateSMatrix(TSMatrix &M){

   if(M.tu != 0)                                       //M如果非空

              DestroySMatrix(M);

    int m, n, t, i, j, e;

    int flag = 0;                               //flag用来标志输入是否重复

    printf("请输入矩阵的行数、列数和非零元个数(格式为:X,X,X)\n");

    while(1){

        scanf("%d,%d,%d",&m,&n,&t);

        if(t<=0 || m<=0 || n<=0){                   //输入的行列数要为整数

             printf("对不起,您输入有误!请重新输入!\n");

             printf("请输入矩阵的行数、列数和非零元个数(格式为:X,X,X)\n");            

        }else if(t > m*n){               //非零元个数不能大于矩阵最大个数

             printf("对不起,您输入的非零元个数不合理!请重新输入!\n");

             printf("请输入矩阵的行数、列数和非零元个数(格式为:X,X,X)\n");           

        }else                                           //输入正确

            break;       

    }

    M.mu = m; M.nu = n; M.tu = t;  

    printf("请输入你想创建的稀疏矩阵:(格式为:X,X,X)\n");    

    for(int k=1; k<=M.tu; k++){

        scanf("%d,%d,%d",&i,&j,&e);

        if(i > M.mu){

            printf("输入有误,行号过大,请重新输入!\n");

            k--;

        }else if(i <= 0){

             printf("输入有误,行号必须为正数,请重新输入!\n");

             k--;

        }else if(j <= 0){

             printf("输入有误,列号必须为正数,请重新输入!\n");

             k--;

        }else if(j > M.nu){

            printf("输入有误,列号过大,请重新输入!\n");

            k--;

        }else if(e == 0){

            printf("输入有误,值不能为零,请重新输入!\n");

            k--;

        }else {               

            for(int t=1; t<=k; t++){

                if(i==M.data[t].i &&j==M.data[t].j){

                    printf("输入有误,您输入的下标重复,请重新输入!\n");

                    k--;

                    flag = 1;

                    break;

                }                                  

            }

            if(flag == 0){                   //输入完全正确情况下

                M.data[k].i = i;

                M.data[k].j = j;

                M.data[k].e = e;

            }   

        }                   

    }

    //对三元组表示的稀疏矩阵进行排序 

    Order(M);

    printf("*矩阵已完成创建!*\n");

    return OK;

}                                   

//输出稀疏矩阵M

voidPrintSMatrix(TSMatrix M){                                      

    printf("\t-----------------");

    printf("\n");

   printf("\t%c\t%c\t%c",'i','j','e');

    printf("\n");

    printf("\t-----------------");

    printf("\n");

    if(M.tu == 0)                                    //如果为空

        printf("\t这是一个空的矩阵\n");

    else{   

        for(int k=1; k<=M.tu; k++){     

            printf("\t%d\t%d\t%d",M.data[k].i,M.data[k].j,M.data[k].e);

            printf("\n");

        }

    }    

    printf("\t-----------------");

    printf("\n\n");

}

//查找三元组表示的稀疏矩阵M中,第row行,第col列元素,若不为0则用e返回其值

StatusFindElem(TSMatrix M, int row, int col, ElemType &e){   

    for(int k=1; k<=M.tu; k

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值