最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言數(shù)據(jù)結(jié)構(gòu)創(chuàng)建及遍歷十字鏈表

 更新時(shí)間:2021年10月15日 16:17:08   作者:揮刀五百下  
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)十字鏈表的創(chuàng)建及遍歷,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪

本文需要讀者有一定的代碼基礎(chǔ),了解指針,鏈表,數(shù)組相關(guān)知識(shí)。

一、十字鏈表是什么?

十字鏈表常用于表示稀疏矩陣,可視作稀疏矩陣的一種鏈?zhǔn)奖硎?,因此,這里以稀疏矩陣為背景介紹十字鏈表。不過,十字鏈表的應(yīng)用遠(yuǎn)不止稀疏矩陣,一切具有正交關(guān)系的結(jié)構(gòu),都可用十字鏈表存儲(chǔ)。

二、十字鏈表的存儲(chǔ)結(jié)構(gòu)

1.用于總結(jié)點(diǎn)的存儲(chǔ)結(jié)構(gòu)

m:總行數(shù)

n:總列數(shù)

len:總元素個(gè)數(shù)

row_head:行指針數(shù)組(通過行指針數(shù)組可以快速定位到某一行)

col_head:列指針數(shù)組

2.用于單個(gè)節(jié)點(diǎn)的存儲(chǔ)結(jié)構(gòu)

row :行數(shù)

col:列數(shù)

value:存儲(chǔ)的元素值

right :右指針域

down:下指針域

3.對(duì)于每一行,通過指針數(shù)組記錄下每一行的頭節(jié)點(diǎn)位置,對(duì)于列來說相同

4.通過對(duì)某一行,某一列的元素可以快速訪問

三、代碼實(shí)現(xiàn)

 1.引入頭文件并定義結(jié)構(gòu)體

#include <stdio.h> 
#include<stdlib.h>
/*十字鏈表的總結(jié)點(diǎn)結(jié)構(gòu)類型定義如下:*/
typedef struct OLNode
{
	int row, col; /*非零元素的行和列下標(biāo)*/
	int value;
	struct OLNode* right; /*非零元素所在行表、列表的后繼鏈域*/
	struct OLNode* down;
}OLNode,  *OLink;
 
/*單個(gè)節(jié)點(diǎn)結(jié)構(gòu)類型定義如下:*/
typedef struct
{
	OLink* row_head; /*行、列鏈表的頭指針向量*/
	OLink* col_head;
	int m, n, len; /*稀疏矩陣的行數(shù)、列數(shù)、非零元素的個(gè)數(shù)*/
}CrossList;
void out_M(CrossList M);
void CreateCrossList(CrossList* M);

2.建立十字鏈表

void CreateCrossList(CrossList* M)
{
	int m, n, t, i, j, e;
	OLNode* p;//單元的結(jié)構(gòu)體指針  
	OLNode* q;
/*采用十字鏈表存儲(chǔ)結(jié)構(gòu),創(chuàng)建稀疏矩陣M*/
	printf("請(qǐng)輸入行數(shù),列數(shù)和非零元素的個(gè)數(shù)\n");
	scanf_s("%d%d%d", &m, &n, &t); /*輸入M的行數(shù),列數(shù)和非零元素的個(gè)數(shù)*/
	M->m = m;
	M->n = n;
	M->len = t;
	M->row_head = (OLink*)malloc((m + 1) * sizeof(OLink));
	M->col_head = (OLink*)malloc((n + 1) * sizeof(OLink));
/*初始化行、列頭指針向量,各行、列鏈表為空的鏈表*/
	for (int h = 0; h < m + 1; h++)
	{
		M->row_head[h] = NULL;
	}
	for (int t = 0; t < n + 1; t++)
	{
		M->col_head[t] = NULL;
	}
	printf("請(qǐng)輸入第i行,第j列中存儲(chǔ)的元素,以0結(jié)束\n");
	for (scanf_s("%d%d%d", &i, &j, &e); i != 0; scanf_s("%d%d%d", &i, &j, &e))
	{
		p = (OLNode*)malloc(sizeof(OLNode));
		p->row = i;
		p->col = j;
		p->value = e; /*生成結(jié)點(diǎn)*/
		/*在十字鏈表中插入節(jié)點(diǎn),對(duì)于行指針數(shù)組和列指針數(shù)組分開看,類似于單鏈表中的插入操作*/
		if (M->row_head[i] == NULL)
		{
			M->row_head[i] = p;
			p->right = NULL;
		}
		else
		{
/*尋找行表中的插入位置*/
			for (q = M->row_head[i]; q->right && q->right->col < j; q = q->right); /*空循環(huán)體*/
			p->right = q->right;
			q->right = p; /*完成插入*/
		}
		if (M->col_head[j] == NULL)
		{
			M->col_head[j] = p;
			p->down = NULL;
		}
		else
		{
/*尋找列表中的插入位置*/
			for (q = M->col_head[j]; q->down && q->down->row < i; q = q->down); /*空循環(huán)體*/
			p->down = q->down;
			q->down = p; /*完成插入*/
		}
	}
}

3.遍歷十字鏈表

void out_M(CrossList M)
{
	/*遍歷十字鏈表的思想:可采用雙重for循環(huán)實(shí)現(xiàn),對(duì)于每一行中的每一列進(jìn)行遍歷輸出*/
	int i;
	OLNode* p;
	char ch;
	/*  輸出矩陣的總行數(shù)、總列數(shù)、非零元素總個(gè)數(shù) */
	printf("\n  總行數(shù)有%d    總列數(shù)有%d   非零元素有%d\n", M.m,M.n,M.len);
	for (i = 1; i <= M.m; i++) {
		p = M.row_head[i];         /*  指向第i行 */
		if (p) {
			printf("\n 第%d行的數(shù)據(jù)如下\n", i);
			while (p) {
				printf("  (%3d%3d%4d) ", p->row, p->col, p->value);
				p = p->right;
			}
		}
		printf("\n");
	}
}

4.調(diào)用函數(shù)

void out_M(CrossList M)
{
	/*遍歷十字鏈表的思想:可采用雙重for循環(huán)實(shí)現(xiàn),對(duì)于每一行中的每一列進(jìn)行遍歷輸出*/
	int i;
	OLNode* p;
	char ch;
	/*  輸出矩陣的總行數(shù)、總列數(shù)、非零元素總個(gè)數(shù) */
	printf("\n  總行數(shù)有%d    總列數(shù)有%d   非零元素有%d\n", M.m,M.n,M.len);
	for (i = 1; i <= M.m; i++) {
		p = M.row_head[i];         /*  指向第i行 */
		if (p) {
			printf("\n 第%d行的數(shù)據(jù)如下\n", i);
			while (p) {
				printf("  (%3d%3d%4d) ", p->row, p->col, p->value);
				p = p->right;
			}
		}
		printf("\n");
	}
}

以上就是C語言數(shù)據(jù)結(jié)構(gòu)創(chuàng)建及遍歷十字鏈表的詳細(xì)內(nèi)容,更多關(guān)于C語言數(shù)據(jù)結(jié)構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++ 壓縮文件及文件夾方法 使用zlib開源庫(kù)

    C++ 壓縮文件及文件夾方法 使用zlib開源庫(kù)

    下面小編就為大家分享一篇C++ 壓縮文件及文件夾方法 使用zlib開源庫(kù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • C語言 module_init函數(shù)與initcall案例詳解

    C語言 module_init函數(shù)與initcall案例詳解

    這篇文章主要介紹了C語言 module_init函數(shù)與initcall案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 詳解Qt6?QML?Settings?location?不創(chuàng)建指定路徑文件

    詳解Qt6?QML?Settings?location?不創(chuàng)建指定路徑文件

    到Qt6以后,?棄用了fileName屬性,改用location屬性,但有個(gè)坑,本文就來介紹一下Qt6?QML?Settings?location不創(chuàng)建指定路徑文件,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • C++實(shí)現(xiàn)連連看游戲

    C++實(shí)現(xiàn)連連看游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)連連看游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C/C++通過SQLite SDK實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查操作

    C/C++通過SQLite SDK實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查操作

    SQLite,作為一款嵌入式關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),一直以其輕量級(jí)、零配置以及跨平臺(tái)等特性而備受青睞,本文主要介紹了C++如何通過SQLite SDK實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查操作,感興趣的可以了解下
    2023-11-11
  • C++中的hpp文件及使用hpp文件的好處

    C++中的hpp文件及使用hpp文件的好處

    hpp文件是C++程序中一種特殊頭文件,它可以包含類的聲明和實(shí)現(xiàn),詳細(xì)介紹了使用hpp文件的好處及注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • 詳解C++中的雙冒號(hào) ::

    詳解C++中的雙冒號(hào) ::

    這篇文章主要介紹了C++中的雙冒號(hào) ::,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • 關(guān)于C++繼承你可能會(huì)忽視的點(diǎn)

    關(guān)于C++繼承你可能會(huì)忽視的點(diǎn)

    繼承是面向?qū)ο笕筇匦灾?有些類與類之間存在特殊的關(guān)系,下面這篇文章主要給大家介紹了關(guān)于C++繼承你可能會(huì)忽視的點(diǎn),文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • C++算法計(jì)時(shí)器的實(shí)現(xiàn)示例

    C++算法計(jì)時(shí)器的實(shí)現(xiàn)示例

    本文主要介紹了C++算法計(jì)時(shí)器的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 詳解C語言中的Static關(guān)鍵字

    詳解C語言中的Static關(guān)鍵字

    這篇文章主要為大家介紹了C語言中Static關(guān)鍵字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評(píng)論

格尔木市| 东莞市| 柳州市| 灵山县| 思南县| 会宁县| 锦屏县| 丰台区| 深泽县| 榆中县| 牟定县| 西安市| 顺义区| 青神县| 惠安县| 屏山县| 开原市| 榆树市| 柏乡县| 江口县| 溧阳市| 普格县| 星子县| 岳普湖县| 广灵县| 乌兰浩特市| 武胜县| 东台市| 瑞丽市| 沂源县| 正安县| 塘沽区| 仪陇县| 和静县| 林甸县| 东兰县| 和龙市| 屏山县| 清水县| 灵寿县| 讷河市|