中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言如何創建及遍歷十字鏈表

發布時間:2021-10-15 17:26:51 來源:億速云 閱讀:203 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關C語言如何創建及遍歷十字鏈表,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

一、十字鏈表是什么?

十字鏈表常用于表示稀疏矩陣,可視作稀疏矩陣的一種鏈式表示,因此,這里以稀疏矩陣為背景介紹十字鏈表。不過,十字鏈表的應用遠不止稀疏矩陣,一切具有正交關系的結構,都可用十字鏈表存儲。

二、十字鏈表的存儲結構

1.用于總結點的存儲結構

C語言如何創建及遍歷十字鏈表

m:總行數

n:總列數

len:總元素個數

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

col_head:列指針數組

2.用于單個節點的存儲結構

C語言如何創建及遍歷十字鏈表

row :行數

col:列數

value:存儲的元素值

right :右指針域

down:下指針域

3.對于每一行,通過指針數組記錄下每一行的頭節點位置,對于列來說相同

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

三、代碼實現

 1.引入頭文件并定義結構體

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

2.建立十字鏈表

void CreateCrossList(CrossList* M)
{
	int m, n, t, i, j, e;
	OLNode* p;//單元的結構體指針  
	OLNode* q;
/*采用十字鏈表存儲結構,創建稀疏矩陣M*/
	printf("請輸入行數,列數和非零元素的個數\n");
	scanf_s("%d%d%d", &m, &n, &t); /*輸入M的行數,列數和非零元素的個數*/
	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("請輸入第i行,第j列中存儲的元素,以0結束\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; /*生成結點*/
		/*在十字鏈表中插入節點,對于行指針數組和列指針數組分開看,類似于單鏈表中的插入操作*/
		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); /*空循環體*/
			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); /*空循環體*/
			p->down = q->down;
			q->down = p; /*完成插入*/
		}
	}
}

3.遍歷十字鏈表

void out_M(CrossList M)
{
	/*遍歷十字鏈表的思想:可采用雙重for循環實現,對于每一行中的每一列進行遍歷輸出*/
	int i;
	OLNode* p;
	char ch;
	/*  輸出矩陣的總行數、總列數、非零元素總個數 */
	printf("\n  總行數有%d    總列數有%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行的數據如下\n", i);
			while (p) {
				printf("  (%3d%3d%4d) ", p->row, p->col, p->value);
				p = p->right;
			}
		}
		printf("\n");
	}
}

4.調用函數

void out_M(CrossList M)
{
	/*遍歷十字鏈表的思想:可采用雙重for循環實現,對于每一行中的每一列進行遍歷輸出*/
	int i;
	OLNode* p;
	char ch;
	/*  輸出矩陣的總行數、總列數、非零元素總個數 */
	printf("\n  總行數有%d    總列數有%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行的數據如下\n", i);
			while (p) {
				printf("  (%3d%3d%4d) ", p->row, p->col, p->value);
				p = p->right;
			}
		}
		printf("\n");
	}
}

關于“C語言如何創建及遍歷十字鏈表”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

磐安县| 宁陕县| 临西县| 平泉县| 砀山县| 济南市| 德令哈市| 黔西| 原阳县| 曲阳县| 筠连县| 石景山区| 金阳县| 额尔古纳市| 宣威市| 绥中县| 田阳县| 阿城市| 东乡县| 深水埗区| 无极县| 东辽县| 陵川县| 长岭县| 沅江市| 郯城县| 浙江省| 弋阳县| 天台县| 河北区| 赫章县| 苍梧县| 建德市| 大兴区| 高要市| 平乡县| 德昌县| 德保县| 乌拉特中旗| 迁西县| 柘城县|