首先强调:n维数组的存储都是线性的,如一个二维数组在计算机中的逻辑结构也是一行接着一行的一个线性表。
下面介绍自己想出来的一种链表结构存储稀疏矩阵
上代码:
#include<stdlib.h>
#include<iostream>
#define MAXSIZE 100
#define OK 1
#define error 0
using namespace std;
//构造元素节点
typedef struct Crossnode{
int row;//行值
int col;//列值
int value;//数据
struct Crossnode*down;//指向下面元素的指针
struct Crossnode*right; //指向右边元素的指针
struct Crossnode*next;//这个指针是用于链接其所有的头指针
}Clnode,*Crossline;
//插入元素与创建链表
void creatlist(Crossline H0){
H0=(Crossline)malloc(sizeof(Clnode));
H0->down=H0;//循环指针
H0->row=0;
int row,col,i,j,n,value;
Crossline pr;//用于插入行的指针
Crossline pc;//用于插入列的指针
pr=H0;
pc=H0;
printf("输入要插入的元素个数:");
scanf("%d",&n);
for(i=0;i<n;i++){
pr=H0;//下一次循时将pr复位
printf("输入第%d个元素的行,列,值",i+1);
scanf("%d %d %d",&row,&col,&value);
//将元素插入行中
while(1){
Crossline pr1;//该指针标记pr的上一个节点,用于后续插入节点
if(row==pr->row)break;
if(pr->down==H0){
Crossline newnode=(Crossline)malloc(sizeof(Clnode));
pr->down=newnode;
newnode->down=H0;
newnode->row=row;
newnode->col=col;
break;
}
if(row<pr->row){
Crossline newnode=(Crossline)malloc(sizeof(Clnode));
newnode->down=pr;
pr1->next=newnode;
newnode->row=row;
newnode->col=col;
break;
}
pr1=pr;//使pr1始终指向pr的前一个节点
pr=pr->down;
}
while(1){
Crossline pc1;//指向pc指针的上一个节点
Crossline pc0=pc;//永远指向首节点
if(pc->right==pc){
Crossline newnode=(Crossline)malloc(sizeof(Clnode));
pc->right=newnode;
newnode->right=pc0;
newnode->col=col;
newnode->value=value;
break;
}
if(col<pc->col){
Crossline newnode=(Crossline)malloc(sizeof(Clnode));
newnode->right=pc;
pc1->right=newnode;
newnode->row=row;
newnode->col=col;
newnode->value=value;
break;
}
}
}
}
int main(){
return 0;
}