• 三元组顺序表表示的稀疏矩阵的转置和加法运算的实现


    #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    #include<conio.h>
    #include<malloc.h>
    #include<string.h>
    #define MAXSIZE 100
    #define MAXMU 25
    typedef struct
    {
    int i,j;
    int v;
    }Triple;
    typedef struct
    { int rpos[MAXMU+1];
    Triple data[MAXSIZE+1];
    int mu,nu,tu;
    }TSMatrix;

    void creat(TSMatrix *T)
    {
    int row,num,k;
    do
    {



    printf(" 请输入稀疏矩阵行数: ");
    scanf("%d", &T->mu);
    if (T->mu<0 || T->mu>MAXMU)
    printf(" 行数超出定义范围,请重新输入! ");
    } while (T->mu<0 || T->mu>MAXMU);
    do
    {
    printf(" 请输入稀疏矩阵列数: ");
    scanf("%d", &T->nu);
    if (T->nu<0 || T->nu>MAXMU)
    printf(" 列数超出定义范围,请重新输入! ");
    } while (T->nu<0 || T->nu>MAXMU);
    do
    {
    printf(" 请输入稀疏矩阵的非零元素个数: ");
    scanf("%d", &T->tu);
    if (T->tu>MAXSIZE || (T->tu>T->mu*T->nu))
    printf(" 非零元素个数超出定义范围,请重新输入! ");
    } while (T->tu>MAXSIZE || (T->tu>T->mu*T->nu));


    for (k=1; k<=T->tu; k++)
    {
    do
    {
    printf(" 请输入第%d个非零元素的行数i:", k);
    scanf("%d", &T->data[k].i);
    if (!T->data[k].i || T->data[k].i>T->mu)
    printf(" 输入有误,请重新输入! ");
    } while ((!T->data[k].i || T->data[k].i>T->mu));
    do
    {
    printf(" 请输入第%d个非零元素的列数j:", k);
    scanf("%d", &T->data[k].j);
    if (!T->data[k].j || T->data[k].j>T->nu)
    printf(" 输入有误,请重新输入! ");
    } while ((!T->data[k].j || T->data[k].j>T->nu));
    do
    {
    printf(" 请输入第%d个非零元素的值v:", k);
    scanf("%d", &T->data[k].v);
    if (T->data[k].v==0)
    printf(" 输入有误,请重新输入! ");
    } while (T->data[k].v==0);

    }
    for(row=1,num=1;row<=T->mu;row++)
    {
    T->rpos[row]=num;
    while(T->data[num].i==row)
    num++;
    }
    return;
    }

    void print(TSMatrix A)
    {
    int q,n,k,a=0;


    printf(" 稀疏矩阵为: ");

    for(n=1;n<=A.mu;n++)
    {
    for(k=1;k<=A.nu;k++)
    {
    for(q=1;q<=A.tu;q++)
    if(A.data[q].i==n && A.data[q].j==k)
    {
    printf(" %-3d",A.data[q].v);break;
    }
    if(q>A.tu)
    printf(" %-3d",a);
    }
    printf(" ");
    }

    }

    void add(TSMatrix A,TSMatrix B)
    {

    int n,k;
    if(A.mu!=B.mu || A.nu!=B.nu)
    {
    printf(" 不满足矩阵相加条件!");
    printf(" 需满足两矩阵的行数、列数均对应相等方可进行加法运算!!");
    }
    else
    {
    for(n=1;n<=A.tu;n++)
    for(k=1;k<=B.tu;k++)
    if(A.data[n].i==B.data[k].i && A.data[n].j==B.data[k].j)
    {
    A.data[n].v+=B.data[k].v;
    B.data[k].v=0;
    }
    for(k=1;k<=B.tu;k++)
    if(B.data[k].v!=0)
    {
    A.data[A.tu+1].i=B.data[k].i;
    A.data[A.tu+1].j=B.data[k].j;
    A.data[A.tu+1].v=B.data[k].v;
    A.tu++;
    }
    print(A);
    }
    }



    char menu()
    {
    char n;


    printf(" 1:矩阵相加 ");
    printf(" 2:矩阵转置 ");
    printf(" 3:退出 ");
    printf(" 输入序号进行操作 ");
    ;n=getchar();

    return n;
    }

    void zhuanzhi(TSMatrix A)
    {
    int p,q,m;
    TSMatrix B;
    B.mu=A.nu;
    B.nu=A.mu;
    B.tu=A.tu;
    if(B.tu)
    {
    m=1;
    for(p=1;p<=A.mu;p++)
    for(q=1;q<=A.nu;q++)
    {
    B.data[m].i=A.data[m].j;
    B.data[m].j=A.data[m].i;
    B.data[m].v=A.data[m].v;
    ++m;
    }
    }
    print(B);
    }



    int main()
    {
    TSMatrix A,B,C;

    for(;;)
    switch(menu())
    {case '1':creat(&A);
    creat(&B);
    print(A);
    print(B);
    add(A,B);
    getch();
    break;
    case '2':creat(&A);
    print(A);
    zhuanzhi(A);
    getch();
    break;
    case '3':


    exit(0);
    }
    }

  • 相关阅读:
    软件层次结构
    PHP 配合Cross-Origin Resource Sharing实现跨域 使用心得
    C语言 标准I/O库函数 fgets 使用心得
    PHP 逗号运算符 的作用
    PHP 函数 array_map 使用心得
    PHP 函数 htmlspecialchars 使用心得
    Go语言特性学习
    curl文件上传类
    php 协程理解
    php 分词扩展 scws
  • 原文地址:https://www.cnblogs.com/xufeng123/p/8018490.html
Copyright © 2020-2023  润新知