天天看點

稀疏矩陣的三元組表示方式代碼模闆(C++表示)

  稀疏矩陣的三元組表示方式代碼模闆

#include <iostream>
#define MaxSize 100

//定義三元組線性表中的資料元素存儲結構
typedef struct
{
    int row;        //行号
    int col;        //列号
    ElemType d;     //元素值,ElemType為資料元素類型

} TupNode; //三元組定義
typedef struct
{
int rows;                   //行數值
int cols;                   //列數值
int nums;                   //非零元素個數
TupNode data[MaxSize];      //data資料域

} TSMatrix; //三元組順序表定義
//以行序方式掃描二維矩陣A,将其非零的元素加入到三元組t
//以3行4列的稀疏矩陣為例
void CreatMat(TSMatrix *t, int arr[3][4])
{
    int i;
    int j;
    t->rows = 3;
    t->cols = 4;
    t->nums = 0;

    //掃描矩陣中的非零元素
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 4; j++)
        {
            //隻存非零值,以三元組方式
            if(arr[i][j] != 0)
            {
                t->data[t->nums].row = i;
                t->data[t->nums].col = j;
                t->data[t->nums].d = arr[i][j];
                t->nums++;
            }
        }
    }
}
//将三元組線性表中指定位置的元素值指派給變量x
void arr_Assign(TSMatrix t , int *data , int i , int j)
{
    int k = 0;
    //i和j是否合法
    if(i >= t.rows || j >= t.cols)
    {
        return;
    }

    //找到指定元素的行下标
    while(k < t.nums && i > t.data[k].row)
    {
        k++;
    }

    //當找到指定元素的行下标後,再找到指定元素的列下标
    while (k < t.nums && i == t.data[k].row && j > t.data[k].col)
    {
        k++;
    }
    //如果指定元素的行和列都相等,說明找到了
    if(t.data[k].row == i && t.data[k].col)
    {
        *data = t.data[k].d;
    }
    else
    {
        //說明沒找到
        *data = 0;
    }
}
//修改三元組元素中的值:執行A[i][j]=x
void arr_Value(TSMatrix *t , int data , int i , int j)
{
    int k = 0;
    int k1;
    //指定的行和列是否合法
    if(i >= t->rows || j >= t->cols)
    {
        return;
    }
    //先查找行
    while(k < t->nums && i > t->data[k].row)
    {
        k++;
    }

    //查找列
    while(k < t->nums && i == t->data[k].row && j > t->data[k].col)
    {
        k++;
    }

    //當找到指定位置時直接修改
    if(i == t->data[k].row && j == t->data[k].col)
    {
        t->data[k].d = data;
    }
    else
    {
        //如果指定位置不存在,則說明該元素值為0,此時插入
        for(k1 = t->nums; k1 >= k; k1--)
        {
            t->data[k1+1].col = t->data[k1].col;
            t->data[k1+1].row = t->data[k1].row;
            t->data[k1+1].d = t->data[k1].d;
        }
        //插入資料
        t->data[k].row = i;
        t->data[k].col = j;
        t->data[k].d = data;
        t->nums++;
    }
}
//定義三元組線性表存儲結構
void DispMat(TSMatrix *t)
{
    int i;
    if(t->nums <= 0)
    {
        return;
    }
    printf("\t行數:%d\t列數:%d\t元素個數:%d\n", t->rows , t->cols , t->nums);
    printf(" ------------------\n");
    //輸出所有的三元組
    for(i = 0; i < t->nums; i++)
    {
        printf("\t第%d行\t第%d列\t%d\n" , t->data[i].row , t->data[i].col, t->data[i].d);
    }
}
int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
           

繼續閱讀