注释-C++下面一段代码中的if的情况感觉不懂

问题描述

C++下面一段代码中的if的情况感觉不懂
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node{
    int data;
    struct node *prior;
    struct node *next;
} node;//双向链表结构体定义
int main()
{
    node *num1,*num2,*sum;
    node *create(node *n);
    int output(node *n);
    node *add_Num(node *n1,node *n2);
    num1=(node *)malloc(sizeof(node));
    num2=(node *)malloc(sizeof(node));
    printf("求两个任意长整数的和

");
    printf("输入时每四位用逗号隔开

如:123456789

");
    printf("输入格式为:1,2345,6789

");
    printf("输入整数1:");
    num1=create(num1);//建立第一个新结点
    printf("输入整数2:");
    num2=create(num2);//建立第二个新结点
    printf("
两整数的和为:");
    sum=add_Num(num1,num2);
    output(sum);
}//定义主函数
int output(node *n)
{
  node *p;
  if(n->data<0) //判断输出结果的正负
  printf("-");
  printf("%d,",n->next->data);
  p=n->next->next;
  while(p!=n->next)
  {
    if(p->data<1000) printf("0");
    if(p->data<100) printf("0");
    if(p->data<10) printf("0");
    printf("%d,",p->data);
    p=p->next;
   }
  printf("
");
 }//控制输出的格式
node *create(node *n)
{//创建一个双向链表
  node *p,*t;
  int data,i;
  t=(node *)malloc(sizeof(node));
  i=scanf("%d",&data);
  if(data<0)
  n->data=-1;//如果长整数小于0则把符号保存在头结点中
  else
  n->data=1;//如果长整数大于0则把符号保存在头结点中
  t->data=n->data*data;
  n->next=t;
  t->next=t;
  t->prior=t;
  n->prior=NULL;
  p=n->next;
  while(i!=0)
  {
    if(getchar()==',')//如果输入时“,”的话则执行if语句
    i=scanf("%d",&data);
    else break;
    t=(node *)malloc(sizeof(node));
    t->data=data;
    p->next=t;
    t->prior=p;
    t->next=n->next;
    n->next->prior=t;
    p=p->next;
   }
  return(n);
 }
node *add_Num(node *n1,node *n2)
{
  node *p1,*p2,*t,*s,*sum;
  int e1,e2,carry;
  p1=n1->next->prior;
  p2=n2->next->prior;
  e1=n1->data;
  e2=n2->data;
  sum=(node *)malloc(sizeof(node));
  sum->data=1;
  sum->prior=NULL;
  s=(node *)malloc(sizeof(node));
  s->data=p1->data*e1+p2->data*e2;
  p1=p1->prior;
  p2=p2->prior;
  if(e1*e2==1)//如果两个数同号
  {
    sum->data=e1;
    s->data=abs(s->data);
    if(s->data>=10000)//相加大于等于10000则进位
    {
      s->data-=10000;
      carry=1;
     }
    else carry=0;//否则不进位
   }
  else//如果异号
    if(s->data>=0)
    carry=0;
    else
    {
      s->data+=10000;
      carry=-1;
     }
  t=s;
  s->next=s;
  s->prior=s;
  sum->next=s;
  while(p1!=n1->next->prior&&p2!=n2->next->prior)//将链表当前指针指向表尾
  {
    s=(node *)malloc(sizeof(node));
 s->data=p1->data*e1+p2->data*e2+sum->data*carry;
    p1=p1->prior;
    p2=p2->prior;
    if(e1*e2==1)
    {
      sum->data=e1;
      s->data=abs(s->data);
      if(s->data>=10000)
      {
        s->data-=10000;
        carry=1;
       }
      else carry=0;
     }
    else
      if(s->data>=0) carry=0;
      else
      {
        s->data+=10000;
        carry=-1;
       }
    s->next=t;
    t->prior=s;
    s->prior=sum->next;
    sum->next->next=s;
    t=t->prior;
   }

  if(p1==n1->next->prior)
    while(p2!=n2->next->prior)
    {
      s=(node *)malloc(sizeof(node));
      s->data=p2->data*e2+sum->data*carry;
      p2=p2->prior;
      if(e1*e2==1)
      {
        sum->data=e1;
        s->data=abs(s->data);
        if(s->data>=10000)
        {
          s->data-=10000;
          carry=1;
         }
        else carry=0;
       }
      else
        if(s->data>=0) carry=0;
        else
        {
          s->data+=10000;
          carry=-1;
         }
      s->next=t;
      t->prior=s;
      s->prior=sum->next;
      sum->next->next=s;
      t=t->prior;
     }
  if(p2==n2->next->prior)
    while(p1!=n1->next->prior)
    {
      s=(node *)malloc(sizeof(node));
      s->data=p1->data*e1+sum->data*carry;
      p1=p1->prior;
      if(e1*e2==1)
      {
        sum->data=e1;
        s->data=abs(s->data);
        if(s->data>=10000)
        {
          s->data-=10000;
          carry=1;
         }
        else carry=0;
       }
      else
        if(s->data>=0) carry=0;
        else
        {
          s->data+=10000;
          carry=-1;
         }
      s->next=t;
      t->prior=s;
      s->prior=sum->next;
      sum->next->next=s;
      t=t->prior;
     }
  if(carry!=0)
  {
    s=(node *)malloc(sizeof(node));
    s->data=1;
    carry=0;
    s->next=t;
    t->prior=s;
    s->prior=sum->next;
    sum->next->next=s;
    t=t->prior;
   }
  sum->next=t;
  do
  {
    if(t->data==0)
    {
      sum->next=t->next;
      t->next->prior=t->prior;
      t->prior->next=t->next;
      free(t);
     }
    else break;
    t=sum->next;
   }while(t!=sum->next->prior);
  return(sum);
 }

我自己理解加了注释但不知道对不对,if之后的分情况讨论感觉不能读懂
就是data*e1 e1*e2==1不知道是哪种情况

解决方案

这个应该就是两个长整数的加法啊,通过链表实现每一位分别相加的

解决方案二:

代码粘贴太乱,标出来哪里不懂。

解决方案三:

[程序猿感悟] Understanding your own code(看不懂自己代码的程序猿不可原谅)

解决方案四:

建议你看下链表的定义,知道如何建立链表,然后结合代码看

时间: 2024-12-09 23:32:25

注释-C++下面一段代码中的if的情况感觉不懂的相关文章

select-如何在action的一段代码中读出不同表单的内容,并一一对应?

问题描述 如何在action的一段代码中读出不同表单的内容,并一一对应? 比如说,我在action中,用一个pulbic String select(...)来写, 是不够在里面同时写上6个sql语句吗? 解决方案 用sql中的union,将6个select连起来 string sql = "(select xxx from xxx) union (select yyy from yyy) union(...)" 解决方案二: 楼上的语句是什么意思?求解释

c++-为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的

问题描述 为什么这段代码中对象rectangle的各个成员函数输出的值是对的,而box的却都是错的 #include using namespace std; class rectangle { protected: double length,width,l,w; public: void setlength(); void getlength(); void setwidth(); void getwidth(); double area(); double perimeter(); dou

指针-这段代码中的插入函数编译没有错误,运行就崩溃?其它函数都经过编译了没有错误?不知道是什么问题?

问题描述 这段代码中的插入函数编译没有错误,运行就崩溃?其它函数都经过编译了没有错误?不知道是什么问题? #include #include #include typedef struct POINT { int row; int col; struct POINT *next; }POINT; void initPointLink(POINT **pointLinkHeadPointer); void showPoints(POINT *pointLinkHead); void showOne

javascript-请问bstop在这段代码中的作用?以及“:&amp;amp;#39;+(iCur+iSpeed)+&amp;amp;#39;”中左右两个加号的意思?

问题描述 请问bstop在这段代码中的作用?以及":'+(iCur+iSpeed)+'"中左右两个加号的意思? function getStyle(obj, attr) { if(obj.currentStyle) { return obj.currentStyle[attr]; } else { return getComputedStyle(obj, false)[attr]; } } function startMove(obj, json, fn) { clearInterva

二维数组-请问这段代码中最后输出元素的时候,有必要加个空格吗?

问题描述 请问这段代码中最后输出元素的时候,有必要加个空格吗? static void Main(string[] args) { int[,] score = new int[3, 5]; score[0, 0] = 103; score[1,4] = 80; for (int i = 0; i <3; i++) { for (int j = 0; j < 5; j++) { Console.Write(score[i, j] + " "); Console.WriteL

源代码-这段代码中的下划线,是什么意思?

问题描述 这段代码中的下划线,是什么意思? 这段代码中的下划线,是什么意思?>>呢? 解决方案 没有特殊意思,就是一个叫下划线的参数,这是lambda表达式,作为参数没有用到,所以随便写一个

androi-Drawable.mutate在这段代码中的含义是什么?

问题描述 Drawable.mutate在这段代码中的含义是什么? Drawable.mutate(); ColorMatrix cm = new ColorMatrix(); cm.setSaturation(0); ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm); Drawable.setColorFilter(cf); 解决方案 参考:http://blog.csdn.net/dazme886/article/detai

java-这段代码中mcontext是什么意思,不太明白Context类?

问题描述 这段代码中mcontext是什么意思,不太明白Context类? mcontext在代码中有什么作用,不太懂Context类,求指教! 解决方案 1.它描述的是一个应用程序环境的信息,即上下文. 2.该类是一个抽象(abstract class)类,Android提供了该抽象类的具体实现类. 3.通过它我们可以获取应用程序的资源和类,也包括一些应用级别操作,例如:启动一个Activity,发送广播,接受Intent 信息 等.. 解决方案二: 直白点说Context指的就是你打开的一个

javascript-请问这段代码中的&amp;amp;quot; &amp;amp;quot; 的作用?

问题描述 请问这段代码中的" " 的作用? function hasclass(element, className) { classNamesList = element.className.split(" "); if (classNamesList.indexOf(className) === -1) { return false; } else { return true; } function addClass(element, newClassName)