我第一下拿到这个题目,第一反应就是先定义好数据结构,然后构建好十字链表基础操作的函数,也就是“创插遍历”这些操作。下面是我的定义和函数操作。
typedef int ElemType;
typedef struct OLNode{
int i,j;//行号和列号
ElemType elem;
struct OLNode *right;//右边元素
struct OLNode *down;//下边元素
}OLNode,*OLink;typedef struct CrossList{
OLink* rHead;
OLink* cHead;
int mu,nu,tu;//行数、列数、非零元个数
}CrossList;
CrossList* CreateOLSMatrix(int r,int c,int t){//创建目标十字链表的表头
CrossList* p=(CrossList*)malloc(sizeof(CrossList));
if(p==NULL){
printf("Out of space!");
}
p->mu=r;
p->nu=c;
p->tu=t;
p->rHead=(OLink*)malloc((r+1)*sizeof(OLink));
p->cHead=(OLink*)malloc((c+1)*sizeof(OLink));
if(p->rHead==NULL||p->cHead==NULL) printf("Out of space!\n");
for(int i=0;i<r+1;i++){
p->rHead[i]=NULL;
}//强迫症,初始化操作
for(int i=0;i<c+1;i++){
p->cHead[i]=NULL;
}//强迫症,初始化操作
return p;
}void InsertMatrix(CrossList* p,int i,int j,int elem){//插入数据
OLink p1=(OLink)malloc(sizeof(OLNode));
if(p1==NULL) printf("Out of space!\n");
p1->i=i;p1->j=j;p1->elem=elem;
//创建并填充结点
if(p->rHead[i]==NULL||p->rHead[i]->j>j){
p1->right=p->rHead[i];
p->rHead[i]=p1;
}else{
OLink q=p->rHead[i];
while(1){
if(q->right==NULL||q->right->j>j) break;
q=q->right;
}//找到插入位置
p1->right=q->right;
q->right=p1;
}//完成行插入
if(p->cHead[j]==NULL||p->cHead[j]->i>i){