C语言程序看不懂,求大神注释语句,讲一下思路.好的再给分.程序的目的是这样的:程序是有了,但不是自己编的,所以看不懂,希望懂的人给注释讲解一下.void split(NODE **head){ //分割链表 inti,sum,mo

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/02 21:41:51
C语言程序看不懂,求大神注释语句,讲一下思路.好的再给分.程序的目的是这样的:程序是有了,但不是自己编的,所以看不懂,希望懂的人给注释讲解一下.void split(NODE **head){ //分割链表  inti,sum,mo

C语言程序看不懂,求大神注释语句,讲一下思路.好的再给分.程序的目的是这样的:程序是有了,但不是自己编的,所以看不懂,希望懂的人给注释讲解一下.void split(NODE **head){ //分割链表 inti,sum,mo
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语言程序看不懂,求大神注释语句,讲一下思路.好的再给分.程序的目的是这样的:程序是有了,但不是自己编的,所以看不懂,希望懂的人给注释讲解一下.void split(NODE **head){ //分割链表 inti,sum,mo
提问给出的代码并不完整,在尽可能不更改原程序原意的情况下,添加注释的代码如下:
#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}
}

C语言程序看不懂,求大神注释语句,讲一下思路.好的再给分.程序的目的是这样的:程序是有了,但不是自己编的,所以看不懂,希望懂的人给注释讲解一下.void split(NODE **head){ //分割链表 inti,sum,mo 求大神给个C语言大数阶乘的程序,要有注释的! C语言表达式求值程序和程序注释 请大神帮忙设计一下'1*2*3*4*5*6'这个c程序,并标明一下注释, 这个是用C语言编写的程序算1到10奇数偶数的乘积~~帮我注释一下每一句的含义~原因~~大神现身吧……………… C语言程序中的注释格式由什么组成 如何用汉字给c语言程序较注释 如何用C语言的注释语句把自己的题目原文展现在程序的开头用指针实现两个数的大小比较 用while语句,不准用break语句,求100以内的素数.用C语言写程序 求设计c语言程序 求C语言大神讲解一下这个程序算法的意思,就是为什么要这样算?我能看懂每句的意思,不懂这个算法的道理. C语言中什么是Double型 求大神解说一下 以下叙述正确的是( ) A.在C程序中,main函数必须位于程序的最前面 B.C程序的每行中只能写一条语句 C.C语言本身没有输入输出语句 D.在对一个C程序进行编译的过程中,可发现注释中的拼写错误 求大神给出用C语言编程生成正态分布随机数的程序,要不是标准正态分布的 C语言,分别用if 语句和switch语句编写程序求分段函数的值分别用if 语句和switch语句编写程序,求下列分段函数的值. 在C程序中,注释说明位于一条语句的什么地方 求:求输出2000到2500年份的闰年的C语言程序 用基本的WHILE循环语句和IF判断语句的基础的C语言程序, C程序的if语句和switch语句的用法(说明与例子)我是自学C的,也买了书,但是书上讲的东西有点看不懂.