数据结构实验(C语言):数组运算

文章参考过网上的内容,如果侵权,请联系

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 50  //假设非零元素最大个数为50

typedef struct{
   int i,j;  //该非零元的行下标和列下标
   int e;    //非零值
}Triple;

typedef struct{
   Triple data[MAXSIZE+1];  //非零元三元组表,data[0]未用
   int mu,nu,tu;    //矩阵的行数、列数和非零元个数
}TSMatrix;

int CreateSMatrix(TSMatrix &M)
{  //创建稀疏矩阵M
    int j,i=1;
   printf("输入矩阵的行数、列数、非零元个数\n");
   scanf("%d%d%d",&M.mu,&M.nu,&M.tu);  j=M.tu;
   if(M.tu>MAXSIZE) return 0;
   printf("输入矩阵非零值及其行下标和列下标\n");
   while(j--)
   {
       scanf("%d%d%d",&M.data[i].e,&M.data[i].i,&M.data[i].j);
       i++;
   }

}

void disp(TSMatrix M)
{  //输出函数

   int k=1;
    for(int i=0;i<M.mu;i++)
    {
        for(int j=0;j<M.nu;j++)
           {

               if(i==M.data[k].i-1&&j==M.data[k].j-1)
                {
                printf("%d ",M.data[k].e);
                ++k;
                }

           else printf("0 ");

           if(j==M.nu-1) printf("\n");
           }
    }
}


int AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{ //用矩阵Q返回矩阵M和矩阵N的和
    int s=1,flag=0;
    if(M.mu!=N.mu||M.nu!=N.nu) {printf("矩阵大小不同,无法运算\n");  return 0;}
    else
    {
        Q.mu=M.mu;Q.nu=M.nu;  //设置Q的行列数
        for(int i=1;i<=M.tu;i++)
        { for(int j=1;j<=N.tu;j++)
       {
           if(M.data[i].i==N.data[j].i&&M.data[i].j==N.data[j].j)
         {
             Q.data[s].e=M.data[i].e+N.data[j].e; Q.data[s].i=M.data[i].i; Q.data[s].j=M.data[i].j;
             ++s;//计数
             flag=1;
         }//if

       }//for j
          if(flag==0)
         {
             Q.data[s].e=M.data[i].e; Q.data[s].i=M.data[i].i; Q.data[s].j=M.data[i].j;
             s++;
         }

        }//for i

        for(int i=1;i<=N.tu;i++)
        {    flag=0;
            for(int j=1;j<=M.tu;j++)
             {
                 if(N.data[i].i==M.data[j].i&&N.data[i].j==M.data[j].j)
                  flag=1;
             }
             if(flag==0)
             {
                        Q.data[s].e=N.data[i].e; Q.data[s].i=N.data[i].i; Q.data[s].j=N.data[i].j;
                        s++;
            }//if
        }

    }//else
     Q.tu=s-1;
     return 1;
}

int SubSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{ //用矩阵Q返回矩阵M减去矩阵N的值
    int s=1,flag=0;
    if(M.mu!=N.mu||M.nu!=N.nu) {printf("矩阵大小不同,无法运算\n");  return 0;}
    else
    {
        Q.mu=M.mu;Q.nu=M.nu;  //设置Q的行列数
        for(int i=1;i<=M.tu;i++)
        { for(int j=1;j<=N.tu;j++)
       {
           if(M.data[i].i==N.data[j].i&&M.data[i].j==N.data[j].j)
         {
             Q.data[s].e=M.data[i].e-N.data[j].e; Q.data[s].i=M.data[i].i; Q.data[s].j=M.data[i].j;
             ++s;//计数
             flag=1;
         }//if

       }//for j
          if(flag==0)
         {
             Q.data[s].e=M.data[i].e; Q.data[s].i=M.data[i].i; Q.data[s].j=M.data[i].j;
             ++s;
         }

        }//for i

        for(int i=1;i<=N.tu;i++)
        {   flag=0;
            for(int j=1;j<=M.tu;j++)
             {
                 if(N.data[i].i==M.data[j].i&&N.data[i].j==M.data[j].j)
                  flag=1;
             }
             if(flag==0)
             {
                        Q.data[s].e=-N.data[i].e; Q.data[s].i=N.data[i].i; Q.data[s].j=N.data[i].j;
                        ++s;
                     }//if
        }

    }//else
     Q.tu=s-1;

     return 1;
}

int TransposeSMatrix(TSMatrix M,TSMatrix &T)
{  //求矩阵M的转置矩阵T
    T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
    if(T.tu)
    {
        int q=1;
        for(int col=1;col<=M.nu;++col)
            for(int p=1;p<=M.tu;++p)
               if(M.data[p].j==col)
               {
                   T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i;
                   T.data[q].e=M.data[p].e; ++q;
               }
    }
    return 1;
}

int MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{  //用Q返回矩阵M和矩阵N的积(Q=M*N)
    TSMatrix T;   int m=1,flag=0;
    Q.data[m].e=0;
    if(M.nu!=N.mu){printf("不能相乘\n"); return 0;}
    else
    {
        Q.mu=M.mu;  Q.nu=N.nu;
        TransposeSMatrix(N,T);

        for(int cola=1;cola<=M.mu;cola++)
        {
            for(int colb=1;colb<=T.mu;colb++){

            for(int s=1;s<=M.tu;s++)
            {
                if(M.data[s].i==cola)
                {
                    for(int k=1;k<=T.tu;k++)
                    {
                        if(T.data[k].i==colb)
                        {
                            if(T.data[k].j==M.data[s].j)
                            {
                                Q.data[m].e+=T.data[k].e*M.data[s].e;

                                Q.data[m].i=cola; Q.data[m].j=colb;
                            }
                        }
                        else continue;

                        }//for T.tu

                    }//for colb
                   }
                if(Q.data[m].e!=0)  {++m;Q.data[m].e=0;} //Q.tu加一

            }

        }

    }
    Q.tu=m-1;
    return 1;
}


int main()
{
    TSMatrix M,N,Q;
    printf("矩阵运算\n");
    printf("加法\n");
    printf("输入矩阵一\n");
    CreateSMatrix(M);
    printf("输入矩阵二\n");
    CreateSMatrix(N);
    AddSMatrix(M,N,Q);
    printf("结果\n");
    disp(Q);

    printf("减法\n");
    printf("输入矩阵一\n");
    CreateSMatrix(M);
    printf("输入矩阵二\n");
    CreateSMatrix(N);
    SubSMatrix(M,N,Q);
    printf("结果\n");
    disp(Q);

    printf("乘法\n");
    printf("输入矩阵一\n");
    CreateSMatrix(M);
    printf("输入矩阵二\n");
    CreateSMatrix(N);
    MultSMatrix(M,N,Q);
    printf("结果\n");
    disp(Q);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、填空题(每空1分,共20分) 1. 不包含任何字符(长度为0)的串 称为空串; 由一个或多个空格(仅由空格符)组成的串 称为空白串。 (对应严题集4.1①,简答题:简述空串和空格串的区别) 2. 设S=“A;/document/Mary.doc”,则strlen(s)= 20 , “/”的字符定位的位置为 3 。 4. 子串的定位运算称为串的模式匹配; 被匹配的主串 称为目标串, 子串 称为模式。 5. 设目标T=”abccdcdccbaa”,模式P=“cdcc”,则第 6 次匹配成功。 6. 若n为主串长,m为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为 (n-m+1)*m 。 7. 假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为 288 B ;末尾元素A57的第一个字节地址为 1282 ;若按行存储时,元素A14的第一个字节地址为 (8+4)×6+1000=1192 ;若按列存储时,元素A47的第一个字节地址为 (6×7+4)×6+1000)=1276 。 8. 〖00年计算机系考研题〗设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为 9188 。 答:考虑0行0列,(58列×61行+32行)×2字节+基址2048=9188?? 9. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素 的 行下标 、 列下标 和 元素值 。 10.求下列广义表操作的结果: (1) GetHead【((a,b),(c,d))】=== (a, b) ; //头元素不必加括号 (2) GetHead【GetTail【((a,b),(c,d))】】=== (c,d) ; …………………………

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值