十字链表的建立
- 十字链表是由代表行和列的指针数组指向每个表格里的节点。
- 每个节点除了有行、列、数据信息外,还有指向同行下一个节点的指针,以及指向同列下一个节点的指针。
代码收获
- 定义结构体时候可以不先把指针数组给分配好,但是后面初始化需要给指针数组分配空间,空间为需要多少行或列的sizeof节点。
- 其中难点在于新建一个节点后,需要把其按行和列插入表中。所以需要判断数组指针为空的时候,或者数组指针只存在一个的时候(这个条件应该可以避免,暂时没想到如何做)横向纵向插入,以及在横向或者纵向存在1个以上节点时的插入。
- 在进行横向找位置时,需要判断节点纵向的位置。在纵向找位置时候需要判断节点横向的位置。
#include<stdio.h>
#include<stdlib.h>
# define MAXSIZE 100
//十字链表结构体,每一个单元没有指向前一个的
typedef struct node{
int row;
int col;
int data;
struct node * down;
struct node * rear;
}cnode ,*cnodep;
typedef struct crosslk{
int hang,lie,len;//len是非零个数
cnodep *rhead;
cnodep *chead;
}crosslink,*crosslinkp;
void Initialcrosslink(crosslinkp*L){
*L=(crosslinkp)malloc(sizeof(crosslink));
(*L)->len=0;
}
void Createcrosslink(crosslinkp*L){
printf("输入要插入几个数据\n");
int num,h,l,i,w;
scanf("%d",&num);
getchar();
(*L)->len=num;
printf("输入十字链表的行和列,逗号分隔\n");
scanf("%d,%d",&h,&l);
getchar();
(*L)->hang=h;
(*L)->lie=l;
(*L)->rhead=(cnodep*)malloc(h*sizeof(cnode));
(*L)->chead=(cnodep*)malloc(l*sizeof(cnode));
for(i=0;i<=h;i++) {
(*L)->rhead[i] = NULL;
}
for(i=0;i<=l;i++) {
(*L)->chead[i] = NULL;
}
printf("输入行,列,数据每个节点3个数逗号分隔\n");
for(w=0;w<num;w++){
int a1,a2,a3;
printf("输入:\n");
scanf("%d,%d,%d",&a1,&a2,&a3);
getchar();
cnodep newnodep;
newnodep=(cnodep)malloc(sizeof(cnode));
newnodep->col=a2;
newnodep->row=a1;
newnodep->data=a3;
newnodep->rear=NULL;
newnodep->down=NULL;
//先插入行
if((*L)->rhead[a1]==NULL){
(*L)->rhead[a1]=newnodep;
}else{//否则就得找位置,mov就不是null
cnodep mov;
mov=(*L)->rhead[a1];
if(mov->rear==NULL){//判断第一个mov是不是最后一个
if(mov->col<a2){//插入点比Mov大,在mov后面
mov->rear=newnodep;
}else{//插入点在mov前
(*L)->rhead[a1]=newnodep;
newnodep->rear=mov;
}
}else{//否则每行超过1节点
for(;mov->rear!=NULL&&mov->rear->col<a2;mov=mov->rear);//mov的下一个节点如果不存在或者mov移动到下一个行比插入的行大就停止。插入位置在Mov的下一个
newnodep->rear=mov->rear;
mov->rear=newnodep;
}
} //插入列
if((*L)->chead[a2]==NULL){
(*L)->chead[a2]=newnodep;
}else{//
cnodep mov2;
mov2=(*L)->chead[a2];
if(mov2->down==NULL){//判断第一个mov2是不是最后一个
if(mov2->row<a1){//插入点比Mov大,在后面
mov2->down=newnodep;
}else{//插入点在mov前
(*L)->chead[a2]=newnodep;
newnodep->down=mov2;
}
}else{//否则每行超过1节点
for(;mov2->down!=NULL&&mov2->down->row<a1;mov2=mov2->down);//mov的下一个节点如果不存在或者mov移动到下一个行比插入的行大就停止。插入位置在Mov的下一个
newnodep->down=mov2->down;
mov2->down=newnodep;
}
}
}
}
void Printcrosslink(crosslinkp L){
int num;
cnodep mov;
printf("输出为\n");
for(num=1;num<=L->hang;num++){
for(mov=L->rhead[num];mov!=NULL;mov=mov->rear){
printf("%d ",mov->data);
}
printf("\n");
}
}
void main(){
crosslinkp L;
Initialcrosslink(&L);
Createcrosslink(&L);
Printcrosslink(L);
}
输入要插入几个数据
5
5
输入十字链表的行和列,逗号分隔
8,8
8,8
输入行,列,数据每个节点3个数逗号分隔
输入:
2,3,5
2,3,5
输入:
2,2,6
2,2,6
输入:
3,4,7
3,4,7
输入:
3,3,8
3,3,8
输入:
3,5,9
3,5,9
输出为
6 5
8 7 9