//稀疏矩阵的十字链表存储表示
//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;
}
《数据结构复习》稀疏矩阵的十字链表表示
最新推荐文章于 2024-04-04 15:34:37 发布