【数据结构】十字链表的建立

十字链表的建立

  • 十字链表是由代表行和列的指针数组指向每个表格里的节点。
  • 每个节点除了有行、列、数据信息外,还有指向同行下一个节点的指针,以及指向同列下一个节点的指针。

代码收获

  • 定义结构体时候可以不先把指针数组给分配好,但是后面初始化需要给指针数组分配空间,空间为需要多少行或列的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

业火之理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值