亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

一、十字鏈表是什么?

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

二、十字鏈表的存儲結構

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

m:總行數(shù)

n:總列數(shù)

len:總元素個數(shù)

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

col_head:列指針數(shù)組

2.用于單個節(jié)點的存儲結構

row :行數(shù)

col:列數(shù)

value:存儲的元素值

right :右指針域

down:下指針域

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

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

三、代碼實現(xiàn)

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

#include <stdio.h> 
#include<stdlib.h>
/*十字鏈表的總結點結構類型定義如下:*/
typedef struct OLNode
{
	int row, col; /*非零元素的行和列下標*/
	int value;
	struct OLNode* right; /*非零元素所在行表、列表的后繼鏈域*/
	struct OLNode* down;
}OLNode,  *OLink;
 
/*單個節(jié)點結構類型定義如下:*/
typedef struct
{
	OLink* row_head; /*行、列鏈表的頭指針向量*/
	OLink* col_head;
	int m, n, len; /*稀疏矩陣的行數(shù)、列數(shù)、非零元素的個數(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;//單元的結構體指針  
	OLNode* q;
/*采用十字鏈表存儲結構,創(chuàng)建稀疏矩陣M*/
	printf("請輸入行數(shù),列數(shù)和非零元素的個數(shù)\n");
	scanf_s("%d%d%d", &m, &n, &t); /*輸入M的行數(shù),列數(shù)和非零元素的個數(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("請輸入第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; /*生成結點*/
		/*在十字鏈表中插入節(jié)點,對于行指針數(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)實現(xiàn),對于每一行中的每一列進行遍歷輸出*/
	int i;
	OLNode* p;
	char ch;
	/*  輸出矩陣的總行數(shù)、總列數(shù)、非零元素總個數(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.調用函數(shù)

void out_M(CrossList M)
{
	/*遍歷十字鏈表的思想:可采用雙重for循環(huán)實現(xiàn),對于每一行中的每一列進行遍歷輸出*/
	int i;
	OLNode* p;
	char ch;
	/*  輸出矩陣的總行數(shù)、總列數(shù)、非零元素總個數(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ù)結構創(chuàng)建及遍歷十字鏈表的詳細內容,更多關于C語言數(shù)據(jù)結構的資料請關注腳本之家其它相關文章!

相關文章

  • 老生常談C語言動態(tài)函數(shù)庫的制作和使用(推薦)

    老生常談C語言動態(tài)函數(shù)庫的制作和使用(推薦)

    下面小編就為大家?guī)硪黄仙U凜語言動態(tài)函數(shù)庫的制作和使用(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • C語言實現(xiàn)貪吃蛇游戲演示

    C語言實現(xiàn)貪吃蛇游戲演示

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)貪吃蛇游戲演示,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C語言實現(xiàn)數(shù)字游戲

    C語言實現(xiàn)數(shù)字游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)數(shù)字游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 探討register關鍵字在c語言和c++中的差異

    探討register關鍵字在c語言和c++中的差異

    建議不要用register關鍵字定義全局變量,因為全局變量的生命周期是從執(zhí)行程序開始,一直到程序結束才會終止,而register變量可能會存放在cpu的寄存器中,如果在程序的整個生命周期內都占用著寄存器的話,這是個相當不好的舉措
    2013-10-10
  • C語言的循環(huán)小練習詳解

    C語言的循環(huán)小練習詳解

    這篇文章主要為大家介紹了C語言的循環(huán)小練習,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Qt使用SQLite數(shù)據(jù)庫存儲管理圖片文件

    Qt使用SQLite數(shù)據(jù)庫存儲管理圖片文件

    這篇文章主要為大家詳細介紹了Qt如何使用SQLite數(shù)據(jù)庫實現(xiàn)存儲管理圖片文件的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-04-04
  • C語言用函數(shù)指針實現(xiàn)一個特別的計算器

    C語言用函數(shù)指針實現(xiàn)一個特別的計算器

    函數(shù)指針是一個指針變量,它可以存儲函數(shù)的地址,然后使用函數(shù)指針,下面這篇文章主要給大家介紹了關于C語言用函數(shù)指針實現(xiàn)計算器的方法,需要的朋友可以參考下
    2022-07-07
  • C語言?auto和register關鍵字

    C語言?auto和register關鍵字

    這篇文章主要介紹了C語言?auto、register關鍵字,文章通過變量展開全文相關的詳細內容,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • C語言詳細講解strcpy strcat strcmp函數(shù)的模擬實現(xiàn)

    C語言詳細講解strcpy strcat strcmp函數(shù)的模擬實現(xiàn)

    這篇文章主要介紹了怎樣用C語言模擬實現(xiàn)strcpy與strcat和strcmp函數(shù),strcpy()函數(shù)是C語言中的一個復制字符串的庫函數(shù),strcat()函數(shù)的功能是實現(xiàn)字符串的拼接,strcmp()函數(shù)作用是比較字符串str1和str2是否相同
    2022-05-05
  • C語言中對字母進行大小寫轉換的簡單方法

    C語言中對字母進行大小寫轉換的簡單方法

    這篇文章主要介紹了C語言中對字母進行大小寫轉換的簡單方法,是C語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-08-08

最新評論