#include < iostream >
#include < cstdlib > // malloc 必备的头文件
#define NUM 5 // 矩阵的行数
using namespace std;
// 每行的单链表结点定义
typedef struct LNode{
int data,adj; // 值,列 (存放信息)
struct LNode* next;
}LNode;
// 邻接表定义
typedef struct{
LNode** parray; // 指针数组,存放每行的首地址(m个头结点)
int m; // 行
int n; // 列
}LinkMatrix;
void createLinkMatrix(LinkMatrix &M,int p[][5],int row,int col) // 要记得加 & !!
{
int e; // 存放数组a的元素值
M.m = row;
M.n = col;
M.parray = (LNode**)malloc(row*sizeof(LNode*)); // 为parray分配row个指针
for(int i=0;i<row;i++){
M.parray[i] = NULL; // 初始置空
}
for(int i=0;i<row;i++){
LNode *q = M.parray[i]; // 初始指向表头,每一行的元素指向新建立的结点,即最后一个元素
int flag = 1; // 每行刚开始的标志;
for(int j=0;j<col;j++){
if(e = p[i][j]){ // 存在值,建立新结点
LNode *s;
s = (LNode*)malloc(sizeof(LNode));
s->data = e; // 值
s->adj = j; // 列
s->next = NULL; // 指针置空
if(flag){ // 若为 开头
M.parray[i] = s;
flag = 0;
}
else q->next = s; // 连接
q = s;
}
}
}
}
void displayLinkMatrix(LinkMatrix M)
{
for(int i=0;i<M.m;i++){ // 打印每一行
LNode* p = M.parray[i]; // p指向每行表头
if(p){ // 若每一行的表头不为空
while(p){ // 打印 行、列、值
cout << '[' << i + 1 << ']' << '[' << p->adj + 1 << ']' << '[' << p->data << ']' << " ";
p = p->next; // i,adj 一开始是下标,所以要 +1
}
}
cout<<endl;
}
}
int main()
{
int a[][5] = {3, 0, 0, 0, 7,
0, 0,-1, 0, 0,
-1,-2, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 2, 0};
LinkMatrix M;
createLinkMatrix(M,a,5,5); // 传每一行的基址
displayLinkMatrix(M);
return 0;
}
【数据结构】(邻接表)稀疏矩阵链式存储
最新推荐文章于 2022-11-02 09:50:36 发布