十字链表

今天研究了一下十字链表,当稀疏矩阵的内部元素经常变化时,用三元顺序表操作起来比较麻烦,故用链表来实现对稀疏矩阵的存储,由于矩阵具有二维特性,单链表显然不适用,采用十字链表来实现对稀疏矩阵的存储。

十字链表有三种结点,1.总表头结点 2.行列表头结点 3.非零元素结点。下面一一介绍

1.总表头结点

共有5个子域


Row


Col


Next


Down


Right

Row总行数

Col 总列数

Next 指向第一个行列表头结点

down和right两个指针域空置

2.行列表头结点

行列表头结点的结构与总表头结点相同,m行n列的矩阵需设置S(max(m,n))个行列表头结点


0


0


Next


Down


Right

row和col域置为0.

next指向下一个行列表头结点

right指向本行第1个非零元素结点

down指向本列第1个非零元素结点

行列表头构成循环链表。稀疏矩阵的最后一个头结点next域要求指向总表头结点。

3.非零元素结点


i


j


aij


Down


Right

next域变为value域,用于存放非零元素的值。

row、col域存放行下标和列下标

right域指向本行的下一个非零元素结点

down域指向本列的下一个非零元素结点

行循环链表

最后一个非零元素结点的right指向行表头结点

同理列循环链表

本文实现了稀疏矩阵的建立和显示,见代码:

Linkedmatrix.h

#ifndef LINKEDMATRIX_H_
#define LINKEDMATRIX_H_
typedef int ElemType;
struct Node
{
	int row;
	int col;
	Node *down;
	Node *right;
	union//共用体
	{
		Node *next;
		ElemType val;
	};
};
class Linkedmat
{
private:
	Node *hm;
public:
	Linkedmat();
	~Linkedmat();
	void Create();
	void Show();
};
#endif

Linkedmatrix.cpp

#include "stdafx.h"
#include "Linkedmatrix.h"
#include <iostream>
using namespace std;

Linkedmat::Linkedmat()
{
}
Linkedmat::~Linkedmat()
{
	Node *p,*p1;
	int i;
	for(i=1, p=hm->next; i<=hm->col; i++)//按行展开
	{
		p1=p->right;
		while(p1!=p)
		{
			p->right=p1->right;
			delete p1;
			p1=p->right;
		}
	}
	p=hm->next;
	while(p!=hm)
	{
		hm->next=p->next;
		delete p;
		p=hm->next;
	}
	delete hm;
}
void Linkedmat::Create()
{
	int m,n,s,r,c,v;
	Node *p, *q, *h[15];
	cout<<"请输入您要创建的矩阵维数:"<<endl;
	cout<<"行数:"; cin>>m;
	cout<<"列数:"; cin>>n;
	s=m>n? m:n;
	p=new Node;
	p->row=m; p->col=n;
	hm=p;
	h[0]=p;
	for(int i=1; i<=s; i++)
	{
		p=new Node;
		p->row=0;
		p->col=0;
		h[i]=p;
		p->right=p;
		p->down=p;
		h[i-1]->next=p;
	}
	h[s]->next=hm;//行表头循环链表
	cout<<"注意:"<<endl;
	cout<<"最大行坐标:"<<m<<endl;
	cout<<"最大列坐标:"<<n<<endl;
	cout<<"三元组最多个数:"<<m*n<<endl;
	cout<<"若输入不在此范围内的数据将丢失!"<<endl;
	int t;
	cout<<"输入非零元素个数t = "; cin>>t;
	cout<<"输入三元组的格式(以空格分开):r c v(回车)"<<endl;
	for(int i=0; i<t; i++)
	{
		cout<<"输入三元组:";cin >>r>>c>>v;
		p=new Node;
		p->row=r;
		p->col=c;
		p->val=v;
		//在行上寻找插入位置
		q=h[r];
		while((q->right!=h[r])&&(q->right->col<c))
		{
			q=q->right;
		}
		p->right=q->right;
		q->right=p;
		//在列上寻找插入位置
		q=h[c];
		while((q->down!=h[c])&&(q->down->row<r))
		{
			q=q->down;
		}
		p->down=q->down;
		q->down=p;
	}
}
void Linkedmat::Show()
{
	Node *p,*p1;
	int i,j;
	cout<<"此十字链表存储的矩阵为:"<<endl;
	for(i=1, p=hm->next; p!=hm && i<=hm->row; i++)//按行展开
	{
		p1=p->right;
		for(j=1; j<=hm->col; j++)
		{
			if(p1!=p)
			{
				if(p1->col==j)
				{
					cout<<p1->val<<" ";
					p1=p1->right;
				}
				else
				{
					cout<<"0"<<" ";
				}
			}
			else
			{
				cout<<"0"<<" ";
			}

		}
		cout<<endl;
		p=p->next;
	}
	//////
}

main.cpp

// main.cpp : 定义控制台应用程序的入口点。
//十字链表

#include "stdafx.h"
#include <iostream>
#include "Linkedmatrix.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	Linkedmat Matrix;
	Matrix.Create();
	Matrix.Show();
	system("pause");
	return 0;
}

结果为:

时间: 2024-10-23 09:38:13

十字链表的相关文章

十字链表的方式实现在头部插入图中节点

#include<stdio.h> #include<malloc.h> #define MAX_VERTEX_NUM 20 typedef struct ArcBox{ int tailvex,headvex;//该弧的头和尾定点的位置 struct ArcBox *hlink,*tlink;//分别为弧头和弧尾相同的弧的链域 int *info; }ArcBox; typedef struct VexNode //顶点结点 { char data; //顶点信息(标识) Arc

稀疏矩阵的十字链表存储表示

/* Name: 稀疏矩阵的十字链表存储表示 Copyright: Author: 巧若拙 Date: 29-10-14 21:25 Description: //------------------------------------------------------------------------- 除了用三元组顺序表来存储压缩矩阵,我们还可以用链表结构来存储,实际上后者应用更广泛, 因为当非零元素的数目较大时,三元组的时间复杂度实在太高.链表结构中最常见的是十字链表, 在十字链表中,

数据结构之---C++语言实现图的十字链表存储表示

最近一直忙着考研复习,很久都没有更新博客了,今天写一篇数据结构的存储. //有向图的十字链表存储表示 //杨鑫 #include <iostream> #include <cstdio> #include <stdlib.h> #include <cstring> using namespace std; #define MAX_VERTEX_NUM 20 #define OVERFLOW -2 #define OK 1 typedef int Status

十字链表是有向图的另一种链式存储表示

十字链表是有向图的另一种链式存储表示.形式代码如下: //-------------------有向图的十字链表存储表示-------------------------- #definMA X_VERTEX_NUM20 typedefstructArcBox{ headvex;//该弧的尾和头顶点的位置 inttailvex. *tlink;//分别为弧头相同和弧尾相同的弧的链域 structArcBox*hlink. InfoTyp*info;//该弧相关信息的指针 }A rcBox typ

稀疏矩阵的加法(用十字链表实现A=A+B)

描写叙述: 输入两个稀疏矩阵A和B,用十字链表实现A=A+B,输出它们相加的结果. 输入: 第一行输入四个正整数,各自是两个矩阵的行m.列n.第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数t2,接下来的t1+t2行是三元组,各自是第一个矩阵的数据和第二个矩阵的数据, 三元组的第一个元素表示行,第二个元素表示列,第三个元素是该元素的值. 输出: 输出相加后的矩阵三元组. 输入例子: 3 4 3 2 1 1 1 1 3 1 2 2 2 1 2 1 2 2 3 输出例子: 1 1 1 1 

7-3-有向图的十字链表存储结构-图-第7章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第7章  图 - 有向图的十字链表存储结构 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c.LinkQueue.c        

有向图的十字链表存储形式

十字链表是有向图的另一种链式存储结构.可以看成是将有向图的邻接表和逆邻接表(只考虑入度)结合起来得到的一种链表.在十字链表中,对应于有向图中每一个顶点有一个节点,每一条弧也有一个结点. 顶点之间是数组顺序存储,而弧是链式存储. 弧结点结构: 顶点结点结构: 十字链表形态: 实现: /*********************************************** 有向图的存储形式--十字链表 by Rowandjj 2014/6/27 ***********************

【算法与数据结构】图 -- 十字链表

图的[十字链表]表示法是一种链式存储结构,可以看成是[邻接表]和[逆邻接表]的组合 本文中用到的有向图 /************************************************************************ 有向图的存储:十字链表 有向图的十字链表存储结构,是有一种链式存储结构,可以看成是[邻接表]和[逆邻接表] 的结合. 图中每条弧对应一个[弧结点],每个顶点对应一个[顶点结点] 弧结点 -------------------------------

基于十字链表的两个稀疏矩阵相乘

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef int DataType;// 稀疏矩阵的十字链表存储表示 typedef struct LNode { int i,j; // 该非零元的行和列下标 DataType e; // 非零元素值 struct LNode *right,*down; // 该非零元所在行表和列表的后继链域 }LNode, *Link; typedef str