日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

十字链表表示矩阵c语言,十字链表法,十字链表压缩存储稀疏矩阵详解

發(fā)布時(shí)間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 十字链表表示矩阵c语言,十字链表法,十字链表压缩存储稀疏矩阵详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

對于壓縮存儲稀疏矩陣,無論是使用

圖 1 十字鏈表示意圖

可以看到,使用十字鏈表壓縮存儲稀疏矩陣時(shí),矩陣中的各行各列都各用一各鏈表存儲,與此同時(shí),所有行鏈表的表頭存儲到一個(gè)數(shù)組(rhead),所有列鏈表的表頭存儲到另一個(gè)數(shù)組(chead)中。

因此,各個(gè)鏈表中節(jié)點(diǎn)的結(jié)構(gòu)應(yīng)如圖 2 所示:

圖 2 十字鏈表的節(jié)點(diǎn)結(jié)構(gòu)

兩個(gè)指針域分別用于鏈接所在行的下一個(gè)元素以及所在列的下一個(gè)元素。

鏈表中節(jié)點(diǎn)的 C 語言代碼表示應(yīng)為:

typedef struct OLNode{

int i,j;//元素的行標(biāo)和列標(biāo)

int data;//元素的值

struct OLNode * right,*down;//兩個(gè)指針域

}OLNode;

同時(shí),表示十字鏈表結(jié)構(gòu)的 C 語言代碼應(yīng)為:

#include

#include

typedef struct OLNode

{

int i, j, e; //矩陣三元組i代表行 j代表列 e代表當(dāng)前位置的數(shù)據(jù)

struct OLNode *right, *down; //指針域 右指針 下指針

}OLNode, *OLink;

typedef struct

{

OLink *rhead, *chead; //行和列鏈表頭指針

int mu, nu, tu; //矩陣的行數(shù),列數(shù)和非零元的個(gè)數(shù)

}CrossList;

CrossList CreateMatrix_OL(CrossList M);

void display(CrossList M);

int main()

{

CrossList M;

M.rhead = NULL;

M.chead = NULL;

M = CreateMatrix_OL(M);

printf("輸出矩陣M:\n");

display(M);

return 0;

}

CrossList CreateMatrix_OL(CrossList M)

{

int m, n, t;

int i, j, e;

OLNode *p, *q;

printf("輸入矩陣的行數(shù)、列數(shù)和非0元素個(gè)數(shù):");

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

M.mu = m;

M.nu = n;

M.tu = t;

if (!(M.rhead = (OLink*)malloc((m + 1) * sizeof(OLink))) || !(M.chead = (OLink*)malloc((n + 1) * sizeof(OLink))))

{

printf("初始化矩陣失敗");

exit(0);

}

for (i = 1; i <= m; i++)

{

M.rhead[i] = NULL;

}

for (j = 1; j <= n; j++)

{

M.chead[j] = NULL;

}

for (scanf("%d%d%d", &i, &j, &e); 0 != i; scanf("%d%d%d", &i, &j, &e)) {

if (!(p = (OLNode*)malloc(sizeof(OLNode))))

{

printf("初始化三元組失敗");

exit(0);

}

p->i = i;

p->j = j;

p->e = e;

//鏈接到行的指定位置

if (NULL == M.rhead[i] || M.rhead[i]->j > j)

{

p->right = M.rhead[i];

M.rhead[i] = p;

}

else

{

for (q = M.rhead[i]; (q->right) && q->right->j < j; q = q->right);

p->right = q->right;

q->right = p;

}

//鏈接到列的指定位置

if (NULL == M.chead[j] || M.chead[j]->i > i)

{

p->down = M.chead[j];

M.chead[j] = p;

}

else

{

for (q = M.chead[j]; (q->down) && q->down->i < i; q = q->down);

p->down = q->down;

q->down = p;

}

}

return M;

}

void display(CrossList M) {

for (int i = 1; i <= M.nu; i++)

{

if (NULL != M.chead[i])

{

OLink p = M.chead[i];

while (NULL != p)

{

printf("%d\t%d\t%d\n", p->i, p->j, p->e);

p = p->down;

}

}

}

}

運(yùn)行結(jié)果:

輸入矩陣的行數(shù)、列數(shù)和非0元素個(gè)數(shù):3 3 3

2 2 3

2 3 4

3 2 5

0 0 0

輸出矩陣M:

2?????? 2?????? 3

3?????? 2?????? 5

2?????? 3?????? 4

總結(jié)

以上是生活随笔為你收集整理的十字链表表示矩阵c语言,十字链表法,十字链表压缩存储稀疏矩阵详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。