C语言程序看不懂,求大神讲解。好的一定给分。

2025-05-08 17:45:02
推荐回答(1个)
回答1:

我想最重要的两行我注释上了,lz看一下是否还有问题?

void split(NODE **head){ //分割链表
  int i,sum,most,mostidx,hasbigger;
 NODE *p,*q;
 LISTNODE *listnodep;
 for(i=0,most=0;;i++){ //找最大位和1最多的位
   hasbigger=0;
   for(p=*head,sum=0;p;p=p->next){
     sum+=((p->num&(1<0); //测位,第一次用一个00001来测试所有行的最后一位,第二次就是用00010来测试,如果行和这个数做了&运算以后,如果大于0,就是说明这个位是1,如果不是就为0,这样sum就记录了列上累加的1的个数。
     if((p->num)>>i)hasbigger=1; //这个是i为一定的值的时候,判断某列左边是否还有值了,如果左边全是0了,就不要判断了,就在下面的break中退出了。但凡有一行左边有一个1,就不break。
    }
   if(sum>most){
     most=sum;
     mostidx=i;
    }
   if(hasbigger==0)break;
  }
 listnodep=malloc(sizeof(LISTNODE));
 add_listnode(listnodep);
 listnodep->listhead=NULL;
 for(p=*head;p;p=p->next){
   if((p->num&(1<     if(p==*head){
       *head=p->next;
       add_node(&listnodep->listhead,p);
       p=*head;
     }else{
       for(q=*head;q->next!=p;q=q->next);
       q->next=p->next;
       add_node(&listnodep->listhead,p);
       p=q;
     }
    }
  }
}