zoukankan      html  css  js  c++  java
  • (数据结构)部分稀疏矩阵的操作

    //顺序
    typedef struct {
        int row,
        col; //非零元素的行号、列号
        ElemType val; //元素值
    }
    Triple;
    typedef struct {
        int m,
        n,
        t; //矩阵的行、列数及非零元素个数
        Triple sm[MaxTerms + 1]; //三元组线性表,从sm[1]开始                             
    }
    SMatrix;

    void InitMatrix(SMatrix & M) {
        M.m = 0;
        M.n = 0;
        M.t = 0;
    }
    void InputMatrix(SMatrix & M, int m, int n) { //以行序为主序次序每行输入一个三元组,最后以 “0 0 0” 结束
        int row,
        col,
        val,
        k = 0;
        cin >> row >> col >> val;
        while (row != 0) {
            k++;
            M.sm[k].row = row;
            M.sm[k].col = col;
            M.sm[k].val = val;
            cin >> row >> col >> val;
        }
        M.m = m;
        M.n = n;
        M.t = k;
    }

    //链式
    typedef struct Node {
        int row,
        col; //非零元素的行号、列号
        ElemType val; //元素值
        struct Node * next;
    }
    TripleNode;

    typedef struct {
        int m,
        n,
        t; //矩阵的行、列数及非零元素个数
        TripleNode * vector[MaxRows + 1]; //从vector[1]开始                          
    }
    LMatrix;

    void InitMatrix(LMatrix & M) {
        M.m = 0;
        M.n = 0;
        M.t = 0;
        for (int i = 1; i <= MaxRows; i++) M.vector[i] = NULL;
    }
    void InputMatrix(LMatrix & M, int m, int n) { //以行序为主序次序每行输入一个三元组,最后以 “0 0 0” 结束
        TripleNode * p,
        *q;
        int row,
        col,
        val,
        k = 0;
        cin >> row >> col >> val;
        while (row != 0) {
            k++;
            p = new TripleNode;
            p - >row = row;
            p - >col = col;
            p - >val = val;
            p - >next = NULL;
            //插在单链表末尾
            q = M.vector[row];
            if (q == NULL) M.vector[row] = p;
            else {
                while (q - >next != NULL) q = q - >next;
                q - >next = p;
            }
            cin >> row >> col >> val;
        }
        M.m = m;
        M.n = n;
        M.t = k;
    }

    /*--------------------*/

    SMatrix Transpose(SMatrix M) //转置
    {
        int k = 1;
        SMatrix S;
        InitMatrix(S);
        S.m = M.n;
        S.n = M.m;
        S.t = M.t;
        if (S.t == 0) return S;
        for (int col = 1; col <= M.n; col++) for (int i = 1; i <= M.t; i++) if (M.sm[i].col == col) {
            S.sm[k].row = M.sm[i].col;
            S.sm[k].col = M.sm[i].row;
            S.sm[k].val = M.sm[i].val;
            k++;
        }
        return S;
    }
    LMatrix Add(LMatrix M1, LMatrix M2) {
        int k = 0; //统计非零元个数
        Triple * p1,
        *p2,
        *p,
        *newptr;
        LMatrix M;
        InitMatrix(M);
        M.m = M1.m;
        M.n = M1.n;
        if ((M1.t == 0) && (M2.t == 0)) return M;
        for (int i = 1; i <= M1.m; i++) {
            p1 = M1.vector[i];
            p2 = M2.vector[i];
            p = NULL;
            while ((p1 != NULL) && (p2 != NULL)) {
                if (p1 - >col < p2 - >col) {
                    newptr = new TripleNode; * newptr = *p1;
                    p1 = p1 - >next;
                } else if (p1 - >col > p2 - >col) {
                    newptr = new TripleNode; * newptr = *p2;
                    p2 = p2 - >next;
                } else {
                    if (p1 - >val + p2 - >val == 0) {
                        p1 = p1 - >next;
                        p2 = p2 - >next;
                        continue;
                    } else {
                        newptr = new TripleNode; * newptr = *p1;
                        newptr - >val += p2 - >val;
                        p1 = p1 - >next;
                        p2 = p2 - >next;
                    }
                }
                //以下插入newptr到第i行链尾,并后移p指针
                newptr - >next = NULL;
                if (p == NULL) M.vector[i] = newptr;
                else p - >next = newptr;
                p = newptr;
                k++;
            } //while
            while (p1 != NULL) {
                newptr = new TripleNode; * newptr = *p1;
                newptr - >next = NULL;
                if (p == NULL) M.vector[i] = newptr;
                else p - >next = newptr;
                p = newptr;
                p1 = p1 - >next;
                k++;
            } //while
            while (p2 != NULL) {
                newptr = new TripleNode; * newptr = *p2;
                newptr - >next = NULL;
                if (p == NULL) M.vector[i] = newptr;
                else p - >next = newptr;
                p = newptr;
                p2 = p2 - >next;
                k++;
            } //while
        } //for
        M.t = k;
        return M;
    }

  • 相关阅读:
    48. Rotate Image
    83. Remove Duplicates from Sorted List
    46. Permutations
    HTML5笔记
    18. 4Sum
    24. Swap Nodes in Pairs
    42. Trapping Rain Water
    Python modf() 函数
    Python min() 函数
    Python max() 函数
  • 原文地址:https://www.cnblogs.com/lsj2020/p/5950225.html
Copyright © 2011-2022 走看看