作业1:已知一稀疏矩阵(稀疏矩阵自己定义),试写出该稀疏矩阵的三元组顺序表和三元组单链表,c语言
时间: 2024-02-06 07:11:33 浏览: 77
好的,以下是稀疏矩阵的三元组顺序表和三元组单链表的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 三元组表的最大长度
// 三元组结构体
typedef struct {
int row; // 行下标
int col; // 列下标
int value; // 元素值
} Triple;
// 三元组顺序表结构体
typedef struct {
Triple data[MAXSIZE + 1]; // 三元组表
int rows, cols, nums; // 矩阵的行数、列数、非零元素个数
} TSMatrix;
// 三元组单链表结构体
typedef struct LNode {
int row, col, value;
struct LNode *right, *down;
} TripleNode, *TripleLinkList;
// 创建稀疏矩阵的三元组顺序表
void createTSMatrix(TSMatrix *M) {
printf("请输入矩阵的行数、列数和非零元素个数:\n");
scanf("%d %d %d", &M->rows, &M->cols, &M->nums);
printf("请输入非零元素的行、列和值:\n");
for (int i = 1; i <= M->nums; i++) {
scanf("%d %d %d", &M->data[i].row, &M->data[i].col, &M->data[i].value);
}
}
// 打印稀疏矩阵的三元组顺序表
void printTSMatrix(TSMatrix M) {
printf("该矩阵的三元组顺序表为:\n");
printf("行 下标 列 下标 元素值\n");
for (int i = 1; i <= M.nums; i++) {
printf("%2d %4d %4d %6d\n", i, M.data[i].row, M.data[i].col, M.data[i].value);
}
}
// 创建稀疏矩阵的三元组单链表
void createTripleLinkList(TSMatrix M, TripleLinkList *L) {
*L = (TripleLinkList) malloc(sizeof(TripleNode));
(*L)->row = M.rows;
(*L)->col = M.cols;
(*L)->value = M.nums;
(*L)->right = (*L)->down = NULL;
TripleLinkList row_head[M.rows + 1], col_head[M.cols + 1];
for (int i = 1; i <= M.rows; i++) {
row_head[i] = (TripleLinkList) malloc(sizeof(TripleNode));
row_head[i]->right = NULL;
}
for (int i = 1; i <= M.cols; i++) {
col_head[i] = (TripleLinkList) malloc(sizeof(TripleNode));
col_head[i]->down = NULL;
}
for (int i = 1; i <= M.nums; i++) {
int row = M.data[i].row, col = M.data[i].col, value = M.data[i].value;
TripleLinkList node = (TripleLinkList) malloc(sizeof(TripleNode));
node->row = row;
node->col = col;
node->value = value;
// 将节点插入行链表中
if (row_head[row]->right == NULL || col_head[col]->down == NULL) {
row_head[row]->right = node;
} else {
TripleLinkList p = row_head[row]->right, pre = row_head[row];
while (p != NULL && p->col < col) {
pre = p;
p = p->right;
}
node->right = pre->right;
pre->right = node;
}
// 将节点插入列链表中
if (col_head[col]->down == NULL || row_head[row]->right == NULL) {
col_head[col]->down = node;
} else {
TripleLinkList p = col_head[col]->down, pre = col_head[col];
while (p != NULL && p->row < row) {
pre = p;
p = p->down;
}
node->down = pre->down;
pre->down = node;
}
}
// 将各行链表连接起来
for (int i = 1; i <= M.rows; i++) {
TripleLinkList p = row_head[i];
while (p->right != NULL) {
p = p->right;
}
p->right = (*L);
}
// 将各列链表连接起来
for (int i = 1; i <= M.cols; i++) {
TripleLinkList p = col_head[i];
while (p->down != NULL) {
p = p->down;
}
p->down = (*L);
}
}
// 打印稀疏矩阵的三元组单链表
void printTripleLinkList(TripleLinkList L) {
printf("该矩阵的三元组单链表为:\n");
printf("行 下标 列 下标 元素值\n");
TripleLinkList p = L->right;
for (int i = 1; i <= L->value; i++) {
printf("%2d %4d %4d %6d\n", i, p->row, p->col, p->value);
p = p->right;
}
}
int main() {
TSMatrix M;
createTSMatrix(&M);
printTSMatrix(M);
TripleLinkList L;
createTripleLinkList(M, &L);
printTripleLinkList(L);
return 0;
}
```
以上代码中,`createTSMatrix`函数用于创建稀疏矩阵的三元组顺序表,`printTSMatrix`函数用于打印三元组顺序表,`createTripleLinkList`函数用于创建稀疏矩阵的三元组单链表,`printTripleLinkList`函数用于打印三元组单链表。
阅读全文