我想最重要的两行我注释上了,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;
}
}
}
}