《数据结构复习》稀疏矩阵的十字链表表示

本文介绍如何使用C语言实现稀疏矩阵的十字链表存储表示,包括结构定义、创建过程和插入操作。通过逐行和逐列维护节点,提高存储效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//稀疏矩阵的十字链表存储表示
//ch1_8
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -1
#define OK 1
typedef int status;

typedef struct OLNode {
	int i, j;
	int e;
	struct OLNode* right, * down;
}OLNode,*OLink;
typedef struct {
	OLink* rhead, * chead;
	int mu, nu, tu;
}CrossList;
//十字链表法——创建稀疏矩阵m
status createsmatrix(CrossList* M) {
	int m, n, t, k, i, j, e;
	OLNode* p, * q;
	if (M->rhead) 
		free(M->rhead);
	scanf_s("%d %d %d", &m, &n, &t);
	M->mu = m;
	M->nu = n;
	M->tu = t;
	if (!(M->rhead = (OLink*)malloc((m + 1) * sizeof(OLink))))
		exit(OVERFLOW);
	if (!(M->chead = (OLink*)malloc((n + 1) * sizeof(OLink))))
		exit(OVERFLOW);

	for (k = 1; k <= m; k++)//初始化行头指针,为空链表 
		M->rhead[k] = NULL;
	for (k = 1; k <= n; k++)//初始化列头指针,为空链表
		M->chead[k] = NULL;

	printf("请按任意次序输入%d个非零元的行 列 元素值:(空格)\n", (*M).tu);
	for (k = 0; k <= t; k++) {
		scanf("%d %d %d", &i, &j, &e);
		p = (OLNode*)malloc(sizeof(OLNode));
		if (!p)
			exit(0);
		p->i = i;		//初始化结点
		p->j = j;
		p->e = e;		
		if ((*M).rhead[i] == NULL || (*M).rhead[i]->j > j)
		{
			//第i行头结点为空,或者头结点的列大于此j
			//p插在该行的第一个结点处
			p->right = (*M).rhead[i];
			(*M).rhead[i] = p;
		}
		else // 寻查在行表中的插入位置 
		{
			//从该行的行链表头开始,直到找到
			for (q = (*M).rhead[i]; q->right && q->right->j < j; q = q->right);
			//找到行指针不空且行小于j的
			p->right = q->right; // 完成行插入 
			q->right = p;
		}
		//行链表插入完毕

		if ((*M).chead[j] == NULL || (*M).chead[j]->i > i)
		{
			//列头结点为空,或头结点的行大于此i
			// p插在该列的第一个结点处
			p->down = (*M).chead[j];
			(*M).chead[j] = p;
		}
		else // 寻查在列表中的插入位置 
		{
			for (q = (*M).chead[j]; q->down && q->down->i < i; q = q->down);
			//找到列指针不空且列小于i的
			p->down = q->down; // 完成列插入 
			q->down = p;
		}
		//列链表插入完毕
	}
	return OK;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值