#include<stdio.h>
#include<stdlib.h>
FILE *fp;
// 十字链表 实现 稀疏矩阵 及 矩阵相加
#define OK 0
#define ERROR 1
#define OVERFLOW 1
typedef bool Status;
typedef char ElemType;
typedef struct OLNode//节点信息
{
int i, j;
struct OLNode *right, *down;
ElemType e;
}OLNode,*OLink;
typedef struct
{
OLink *rhead, *chead;
int mu, nu, tu;
}CrossList;
Status CreateSMatrix(CrossList &M)
{
//if (M) free(M);
int m, n, t;
//init m n t
//scanf("%d %d %d", &m, &n, &t);// getchar();
fscanf(fp, "%d %d %d", &m, &n, &t);// getchar();
M.mu = m; M.nu = n; M.tu = t;
//init malloc
if (!(M.rhead = (OLink*)malloc((m + 1)*sizeof(OLink)))) exit(OVERFLOW);
if (!(M.chead = (OLink*)malloc((n + 1)*sizeof(OLink)))) exit(OVERFLOW);
//init null
for (int l = 0; l < m + 1; l++) M.rhead[l] = NULL;
for (int l = 0; l < n + 1; l++) M.chead[l] = NULL;
//get data
int i, j, e;
//while (scanf("%d %d %d", &i, &j, &e) != EOF && i)
while (fscanf(fp,"%d %d %d", &i, &j, &e) != EOF && i)
{
//getchar();
OLink p;
if (!(p = (OLink)malloc(sizeof(OLNode)))) exit(OVERFLOW);
p->e = e; p->i = i; p->j = j;
//插入相应行 中
if (M.rhead[i] == NULL || M.rhead[i]->j > j)
{
p->right = M.rhead[i];
M.rhead[i]= p;
}
else
{
OLink q;
for (q = M.rhead[i]; q->right && q->right->j < j; q = q->right);
p->right = q->right; q->right = p;
}
//接下来插入相应列中
if (M.chead[j] == NULL || M.chead[j]->i>i) { p->down = M.chead[j]; M.chead[j] = p; }
else
{
OLink q;
for (q = M.chead[j]; q->down && q->down->i < i; q = q->down);
p->down = q->down; q->down = p;
}
}
return OK;
}
void InitFile()
{
fp = fopen("data.txt", "r+");
if (!fp) { printf("文件读取错误\n"); exit(ERROR); }
}
int main()
{
InitFile();
CrossList A;
CreateSMatrix(A);
fclose(fp);
return 0;
}
11.十字链表 实现 稀疏矩阵 及 矩阵相加
最新推荐文章于 2023-10-29 16:08:29 发布