#include <iostream.h>
#include<iomanip.h>
#include<conio.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:
void Creat(); //创建一个矩阵十字链表
void Show(); // 输出显示
//……………………
};
void Linkedmat::Creat()
{ int m, n, s, r, c, v,t;
//Node *p,*q,*cp[20];
Node *p;
Node *q; Node *cp[20];
cout << "行维数: "; cin >> m;
cout << "列维数: "; cin >> n;
cout << "非零元素个数: "; cin >>t;
s = m > n ? m : n; //取行列数的大值
p = new Node;
p->row = m; p->col = n;
hm = p; hm->next=hm;
cp[0]=hm;
for ( int i = 1; i <= s; i++ )
// 创建所有行列表头头结点,共 s 个
{ p = new Node;
p->row = 0; p->col = 0;
cp[i] = p;
p->right= p;
p->down = p;
cp[i-1]->next = p;
}
cp[s]->next = hm;
cout << "最大行坐标: " << m << endl;
cout << "最大列坐标: " << n << endl;
cout << "非零元素个数: " <<t << endl;
for( i=0; i<t; i++)
{ cout << "\n 输入三元组:下标从(1,1)开始 "; cin >> r >> c >> v;
p = new Node; //分配新的非零元素结点
p->row = r;
p->col = c;
p->val = v;
q = cp[r]; //在当前行找插入位置
while ( q->right != cp[r] && (q->right->col < c) )
{ q = q->right;}
p->right = q->right;
q->right = p;
q = cp[c]; //在当前列找插入位置
while ( q->down != cp[c] && (q->down->row < r) )
{q = q->down;}
p->down = q->down;
q->down = p;
} //for i=0到t-1;
} //creat建立函数结束
void Linkedmat::Show()
{ //Node *p,* p1;
Node *p;Node *p1;
int i,j;
cout << "\n 十字链表存储的矩阵为:" << endl ;
for ( i = 0; i <= hm->col; i++ )
cout <<setw(6)<< i; // 输出各列的标号
cout << endl << endl;
for ( i = 1, p = hm->next; p != hm; i++ )
{ cout << setw(6) << i; // 输出个行的标号
for ( j = 1, p1 = p->right; p1 != p; j++ )
if ( j == p1->col )
{cout<<setw(6)<<p1->val; p1=p1->right; }
else cout << setw(6)<< " ";
cout << endl; //换行
p = p->next; //找下一个行列表头结点
}
} //输出函数结束
void main()
{
Linkedmat linkedmat;
linkedmat.Creat();
linkedmat.Show ();
}
http://wgyblog.com/html/158.html
分享到:
相关推荐
十字链表存储作为稀疏矩阵的一种高效存储方式,能够充分利用矩阵的稀疏特性,有效压缩存储空间,同时在一定程度上保持数据处理的灵活性和效率。 在讨论稀疏矩阵的十字链表存储方法前,我们首先需要了解何为稀疏矩阵...
本文介绍了一种基于二维数组和十字链表的Apriori改进算法,旨在减少无效候选项集的生成,并通过优化数据存储方式来提高算法的运行效率。 #### 二、Apriori算法原理 Apriori算法的基本思想是利用“先验”性质,即...
《基于二维数组和十字链表的Apriori算法 (1) 数组和链表》这篇论文探讨了在数据挖掘领域中的关联规则挖掘问题,特别是针对Apriori算法的一种优化实现。Apriori算法是一种经典的频繁项集挖掘算法,用于发现数据库中项...
总结而言,本文提出的基于二维数组和十字链表的Apriori算法改进方案,有效优化了原算法中的性能瓶颈。算法改进不仅提升了计算效率,降低了内存占用,还为关联规则挖掘在大数据环境下的应用开辟了新途径。这项研究的...
在稀疏矩阵的存储中,十字链表将非零元素作为链表的节点,每个节点包含5个域:3个数据域存储元素的行号、列号和元素值,另外2个指针域分别指向下一个同列的节点(向右的指针right)和下一个同行的节点(向下的指针...
十字链表是一种特殊的链式数据结构,主要用于二维数组或矩阵的存储。在C语言中实现十字链表,需要理解链表的基本概念,并扩展到多维度的链接方式。本篇文章将详细探讨C语言实现十字链表的相关知识点。 首先,我们要...
本次课程设计的主题是“十字链表”,这是一种专门用于二维数组,例如矩阵,的数据结构。十字链表可以方便地表示矩阵的非零元素,对于进行矩阵运算如加、减、乘、转置和求逆等具有显著优势。 首先,我们需要理解十字...
实验的核心是理解稀疏矩阵的十字链表存储结构,并在此基础上设计并实现转置算法。 稀疏矩阵是指在大量零元素的矩阵中,只存储非零元素的一种高效存储方式。在本实验中,采用了带总头节点、行头结点数组和列头结点...
十字链表还包括两个一维数组,分别存储行链表的头指针和列链表的头指针。 在十字链表中,同一行的非零元素通过行指针链接,同一列的非零元素通过列指针链接,形成一个十字交叉的链表结构。转置十字链表矩阵非常直观...
在实现十字链表模板容器类时,我们需要定义一个模板参数,如`template<typename T>`,这表示我们的十字链表可以存储任何类型的数据(只要该类型支持必要的操作,如赋值和比较)。 接下来是节点的定义。每个节点不仅...
十字链表数据结构是一种在计算机科学中用于存储和操作二维数据的高级数据结构。它以节点为基础,每个节点包含四个指针,分别指向上下左右四个方向的相邻元素,从而形成一个类似于十字交叉的链接模式。这种数据结构...
- **十字链表**:每个非零元素都有一个行指针和一个列指针指向下一个非零元素。 #### 四、广义表 广义表是一种复杂的数据结构,它可以被视为线性表的扩展。在广义表中,元素可以是单个数据项,也可以是另一个广义...
另一种存储稀疏矩阵的方法是十字链表,它通过两个链表分别维护矩阵的行和列。每个节点不仅包含元素值,还有指向同一行或同一列下一个非零元素的指针,这样可以在查找和操作元素时提供高效性能。 5.4 广义表 广义表...
#### 二、十字链表存储结构 十字链表是一种特殊的链表结构,主要用于高效地存储稀疏矩阵。在十字链表中,每个节点不仅包含非零元素的值,还包含了该元素的行索引、列索引以及指向同一行和同一列其他非零元素的指针。...
因此,采用十字链表存储结构可以有效地减少存储空间的需求,提高存储效率。 #### 实验内容与要求 1. **读取输入数据**:从字符文件读取三个正整数m、n、t,其中m和n分别表示矩阵的行数和列数,t表示非零元素的数量...
与传统的矩阵存储方式相比,十字链表能更有效地利用内存,尤其适用于非零元素分布稀疏的大规模数据集。这种数据结构通过构建一个由多个链表组成的网络来表示矩阵,每个非零元素都有一个对应的节点,节点之间通过链接...
### C语言实现十字链表 #### 背景与意义 在C语言的学习与应用过程中,数据结构扮演着至关重要的角色。其中,链表作为基本且实用的数据结构之一,在实际编程中有着广泛的应用场景。当涉及到较为复杂的数据处理任务...
- **十字链表**:每个非零元素都连接到两个链表中,分别对应其所在的行和列。 **三元组顺序表示例**: - **定义**:使用结构体 `Triple` 定义三元组,包含行下标 `i`、列下标 `j` 和元素值 `e`。 - **实现**:使用...
十字链表是一种特殊的链式数据结构,主要用于二维数组的存储,尤其在表示稀疏矩阵时非常有效。在传统的二维数组中,如果矩阵大部分元素为零,那么存储空间会被大量浪费。十字链表通过链接的方式,仅存储非零元素,...