作业帮 > 综合 > 作业

C语言程序看不懂,求大神注释语句,讲一下思路.好的再给分.

来源:学生作业帮 编辑:搜搜考试网作业帮 分类:综合作业 时间:2024/05/07 01:31:04
C语言程序看不懂,求大神注释语句,讲一下思路.好的再给分.
程序的目的是这样的:

程序是有了,但不是自己编的,所以看不懂,希望懂的人给注释讲解一下.
void split(NODE **head){ //分割链表
  inti,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<<i))>0);
     if((p->num)>>i)hasbigger=1;
    }
   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<<mostidx))==0){ //将1最多位为0的数加入另一链表
     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;
     }
    }
  }
}
int count_maxbit(NODE *head){ //计算链表中所有数字的二进制最大位
 NODE *p;
  inti,hasbigger;
 for(i=0;;i++){
   hasbigger=0;
   for(p=head;p;p=p->next){
     if((p->num)>>i)hasbigger=1;
    }
   if(hasbigger==0)break;
  }
 return i;
}
C语言程序看不懂,求大神注释语句,讲一下思路.好的再给分.
提问给出的代码并不完整,在尽可能不更改原程序原意的情况下,添加注释的代码如下:
#include <stdio.h>
#include <stdlib.h>

typedef struct _NODE
{
\x09int num;
\x09struct _NODE *next;
}NODE;

typedef struct _listnode
{
\x09NODE* listhead;
\x09struct _listnode* next;
}LISTNODE;

LISTNODE* root=NULL;\x09\x09// 新链表,用于存储被分出去的那部分节点

void add_node(NODE **head,NODE *node){ //将新node节点加入链表head
\x09NODE *p;
\x09if(*head==NULL){
\x09\x09*head=node;
\x09\x09(*head)->next=NULL;
\x09}else{
\x09\x09for(p=*head;p->next;p=p->next);
\x09\x09p->next=node;
\x09\x09node->next=NULL;
\x09}
}

void add_listnode(LISTNODE *node){ //将新listnode链表节点加入链表(加入到全局变量 root 链表中)
\x09LISTNODE *p;
\x09if(root==NULL)
\x09{
\x09\x09root=node;
\x09\x09root->next=NULL;
\x09}else
\x09{
\x09\x09for(p=root;p->next;p=p->next);
\x09\x09p->next=node;
\x09\x09node->next=NULL;
\x09}
}

void split(NODE **head)  //分割链表
{
\x09int i, sum, most, mostidx, hasbigger;
\x09NODE *p, *q;
\x09LISTNODE *listnodep;
\x09for(i = 0, most = 0;; i++) 
\x09{// 寻找链表中二进制数第i列1的个数,most存储1最多的个数,mostidx存储1最多的是哪一列
\x09\x09hasbigger = 0;
\x09\x09for(p = *head, sum = 0; p; p = p->next)
\x09\x09{
\x09\x09\x09sum += ((p->num & (1 << i)) > 0);\x09// sum 存数第i列1的个数
\x09\x09\x09if((p->num) >> i)hasbigger = 1;\x09\x09
\x09\x09}
\x09\x09if(sum > most)\x09// 若第i列1的个数更多
\x09\x09{
\x09\x09\x09most = sum;\x09// 更新most
\x09\x09\x09mostidx = i;// 更新mostidx
\x09\x09}
\x09\x09if(hasbigger == 0)break;\x09// 若已经寻找到最高位,寻找完成结束循环
\x09}
\x09listnodep = (LISTNODE *)malloc(sizeof(LISTNODE));\x09// 新建链表
\x09add_listnode(listnodep);\x09// 添加节点
\x09listnodep->listhead = NULL;
\x09for(p = *head; p; p = p->next)
\x09{
\x09\x09if((p->num & (1 << mostidx)) == 0) //将1最多位为0的数加入另一链表
\x09\x09{
\x09\x09\x09if(p == *head)\x09// 如果是头节点需要删除
\x09\x09\x09{
\x09\x09\x09\x09*head = p->next;\x09// 将头结点的下一个节点作为新的头结点
\x09\x09\x09\x09add_node(&listnodep->listhead, p);\x09// 将删除的头结点添加到另一个链表中
\x09\x09\x09\x09p = *head;\x09\x09\x09// p指向原链表中被删除的节点的下一个节点,继续寻找是否还有需要删除的节点
\x09\x09\x09}
\x09\x09\x09else
\x09\x09\x09{
\x09\x09\x09\x09for(q = *head; q->next != p; q = q->next);\x09// 寻找需要被分走的节点p的上一个节点q
\x09\x09\x09\x09q->next = p->next;\x09// 从原链表中删除该需要分出去的节点p
\x09\x09\x09\x09add_node(&listnodep->listhead, p);\x09// 将从原链表中删除的节点p添加到新链表中
\x09\x09\x09\x09p = q;\x09// p指向原链表中被删除的节点的下一个节点,继续寻找是否还有需要删除的节点
\x09\x09\x09}
\x09\x09}
\x09}
}