本文需要读者有一定的代码基础,了解指针,链表,数组相关知识。
一、十字链表是什么?
十字链表常用于表示稀疏矩阵,可视作稀疏矩阵的一种链式表示,因此,这里以稀疏矩阵为背景介绍十字链表。不过,十字链表的应用远不止稀疏矩阵,一切具有正交关系的结构,都可用十字链表存储。
二、十字链表的存储结构
1.用于总结点的存储结构
m
:总行数
n
:总列数
len
:总元素个数
row_head
:行指针数组(通过行指针数组可以快速定位到某一行)
col_head
:列指针数组
2.用于单个节点的存储结构
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;
printf("请输入行数,列数和非零元素的个数\n");
scanf_s("%d%d%d", &m, &n, &t);
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)
{
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];
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)
{
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];
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语言数据结构创建及遍历十字链表的详细内容,更多关于C语言数据结构的资料请关注编程网其它相关文章!