【原创】数独C语言全解-连载6-代码展示3/3链表操作

3、链表操作

链表操作是最关键的部分了,其中的原理在前面连载2里面详细说明。这里直接贴代码出来。

  

 while(tmp!=NULL){
        //printf("itmp=%d\n",itmp);
        sdktmp[tmp->x][tmp->y]=tmp->ixy;
        blchk=chk(1,tmp->x,tmp->y,sdktmp);
        if(!blchk){
            
            if(tmp->next!=NULL){
                tmp->blok =true;
                tmp->next->pre=tmp;
                tmp=tmp->next;
            }else{
                printf("经过%d次计算后,此数独得以解出\n",itmp);
                printf("----最终结果----\n");
                prtsdk(sdktmp);
                break;
            }
        }else{
            if(tmp->right!=NULL){
                tmp->right->pre=tmp->pre;
                if(tmp->next!=NULL){//最后一个单元格了 
                    tmp->right->next=tmp->next;
                    tmp->next->blok=false;
                }
                tmp->blok=false;
                tmp->pre->next=tmp->right;
                tmp=tmp->right;
                }else{//本行最后一个了 
                do{
                    tmp->blok=false;
                    tmp->pre->next=tmp->left->left->left->left->left->left->left->left;
                    tmp->left->left->left->left->left->left->left->left->blok=false;
                    tmp=tmp->pre;//之前的Do循环只加了这一句,导致无法出正确结果,要加上上面那些才行的。 
                    if(tmp==head){
                        printf("本程序无法解决此数独,请确认是否出错\n"); 
                        prtsdk(sdktmp);
                    }
                }while(tmp->right==NULL);//往前追溯的关键(以前编的时候,也有类似这句的,但忘了具体技巧) 
                //以上不影响最后一个单元格 
                //以下五步同上 
                tmp->right->pre=tmp->pre;
                if(tmp->next!=NULL){//如果是最后一个单元格了,就没有next指针了 
                    tmp->right->next=tmp->next;
                    tmp->next->blok=false;
                }
                tmp->blok=false;
                tmp->pre->next=tmp->right;
                tmp=tmp->right;
                tmp->blok=false;
                
                //重新赋值数独
                for(int iii=0;iii<9;iii++) {
                    for(int jjj=0;jjj<9;jjj++){
                        sdktmp[iii][jjj]=sdk[iii][jjj];
                    }
                }
                //按指针填充表格 
                
                int itmpre=0;
                tmpre=head->next;
                do{
                    itmpre++;
                    if(tmpre->blok==true){
                        sdktmp[tmpre->x][tmpre->y]=tmpre->ixy;
                        tmpre=tmpre->next;
                    }else{
                        break;
                    }
                }while(tmpre!=NULL);
                
            }
        }
        itmp++;
        
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值