⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 长整数加法.cpp

📁 任意长整数加法运算
💻 CPP
📖 第 1 页 / 共 2 页
字号:

      iResult += CurrNodeArray[0]->data -

      CurrNodeArray[1]->data;



      CurrNodeArray[0] = CurrNodeArray[0]->prior;

      CurrNodeArray[1] = CurrNodeArray[1]->prior;

     }

       else if (List_1 != CurrNodeArray[0]) /* 处理剩下的链表 */

      {

       iResult += CurrNodeArray[0]->data;

       CurrNodeArray[0] = CurrNodeArray[0]->prior;

      }



/* 将算好的结点加入结果链表 */

    PushDataToList(&ResultList, iResult, POSITIVE);

    iResultNodeNum++;

    if ((CurrNodeArray[0] == List_1)&& (CurrNodeArray[1] == List_2))

    {

     /* 在链表头插入控制结点 */

      MakeNode(&NewNode, iResultNodeNum);

      PushDataToList(&ResultList, iResultNodeNum, iSign);

    }



     iResult = 0; /* 准备计算下一个结点 */

   }



return ResultList;

}



/* 每次只处理两个操作数链表,正正,结果为正的,负负,结果为负的 */

 LinkType ComputePPNNList(LinkType List_1, LinkType List_2, int iSign)

 {

   int iResult = 0, iCarry = 0, iResultNodeNum = 0;

   LinkType CurrNodeArray[2],

   NewNode = NULL, ResultList = NULL;



/* 初始为每一个操作数链表的尾结点地址 */

   CurrNodeArray[0] = (List_1)->prior;

   CurrNodeArray[1] = (List_2)->prior;



   while (TRUE)

   {

    if (iCarry > 0) /* 处理前一位的进位 */

    {

      iResult += iCarry;

      iCarry = 0;

    }



    if (CurrNodeArray[0] != List_1 &&

    CurrNodeArray[1] != List_2)

    {

     iResult += CurrNodeArray[0]->data + CurrNodeArray[1]->data;

     CurrNodeArray[0] = CurrNodeArray[0]->prior;

     CurrNodeArray[1] = CurrNodeArray[1]->prior;

    }

    else if (CurrNodeArray[0] != List_1)

    {

    iResult += CurrNodeArray[0]->data;

    CurrNodeArray[0] = CurrNodeArray[0]->prior;

    }

    else if (CurrNodeArray[1] != List_2)

    {

    iResult += CurrNodeArray[1]->data;

    CurrNodeArray[1] = CurrNodeArray[1]->prior;

    }



    if (iResult >= 10000)

    {

    iCarry = iResult / 10000;

    iResult = iResult % 10000;

    }



   PushDataToList(&ResultList, iResult, POSITIVE);

   iResultNodeNum++;

   if (iCarry == 0 && CurrNodeArray[0] == List_1&& CurrNodeArray[1] == List_2)

   {

     MakeNode(&NewNode, iResultNodeNum);

     PushDataToList( &ResultList, iResultNodeNum, iSign);

    break;

   }



     iResult = 0; /* 准备计算下一个结点 */

   }



   return ResultList;

}



/*

* 删除多出的0,如删除0000,0010,3333中的0000为0010,3333

* ,但链表为只有一个逻辑结点为0时则不删除.

*/

  status DeleteZero(LinkType *List)

  {

   LinkType CurrNode, DelNode;



/*

* 一旦遇到第一个不为0的结点则退出, 但

* 链表为只有一个逻辑结点为0时则不删除

*/

   CurrNode = DelNode = (*List)->next;

   while (fabs((*List)->data) > 1 && CurrNode->data == 0)

   {

   (*List)->next = CurrNode->next;

   CurrNode->next->prior = *List;

   DelNode = CurrNode;

   CurrNode = CurrNode->next;

   free(DelNode);

/* 控制结点减少一个逻辑结点的个数 */

   (*List)->data += ((*List)->data > 0) ? -1 : 1;

   }



  return TRUE;

}



  status PushDataToList(LinkType *head, int iNodeNum, int sign)

  {

  LinkType NewNode;



/* sign为1时为正的, sign为0时为负的 */

  iNodeNum *= (sign == POSITIVE) ? 1 : -1;

  MakeNode(&NewNode, iNodeNum);

  if (*head != NULL)

  {

/* 将NewNode所指的结点插入链表,使成为头结点 */

  NewNode->next = *head;

  NewNode->prior = (*head)->prior;

  (*head)->prior = NewNode;

  NewNode->prior->next = NewNode;

  }

  *head = NewNode;



  return TRUE;

 }



 status AppendNodeToList(LinkType *head, LinkType NewNode)

 {

  static LinkType CurrNode = NULL;



  if (*head == NULL)

  *head = CurrNode = NewNode;

  else

  {

/* 在链表尾部添加结点 */

  NewNode->next = CurrNode->next;

  CurrNode->next = NewNode;

  NewNode->prior = CurrNode;

  NewNode->next->prior = NewNode;

/* 当前指针向前一步 */

  CurrNode = CurrNode->next;

  }



   return TRUE;

 }



   status MakeNode(LinkType *p, ElemType e)

  {

  *p = (LinkType)malloc(sizeof(NodeType) * 1);

  if (!(*p))

  {

  printf("Error, the memory is overflow!\n");

  return FALSE;

  }

  (*p)->data = e;

  (*p)->prior = (*p)->next = (*p);



  return TRUE;

 }



 status PrintList(LinkType head)

 {

  /* LinkType CurrNode = head; use for debug */

  LinkType CurrNode = head->next;



   if (head == NULL) return FALSE;

   if (head->data < 0) printf("-");

   while (TRUE)

  {

   printf(" %04d", CurrNode->data);

   CurrNode = CurrNode->next;

   if (CurrNode == head) break;

   printf("%c", ',');

  }

  printf("\n");

 

 return TRUE;

}

 

  status ClearMemory(LinkType *headBuff, int iOpNum)

  {

   int iCounter;

 

   for (iCounter = 0; iCounter < iOpNum; iCounter++)

   DeleteList(*(headBuff + iCounter));

   free(headBuff);

 

   return TRUE;

  }

 

  status DeleteList(LinkType head)

 {

  LinkType CurrNode;

 

  if (head == NULL) return FALSE;

  while (1)

  {

  CurrNode = head;

  CurrNode->next->prior = CurrNode->prior;

  CurrNode->prior->next = CurrNode->next;

   if (head == head->next)

   {

    free(CurrNode);

    break;

   }

   head = head->next;

   free(CurrNode);

   }



 return TRUE;

}



/* 输入异常处理 */

 status ErrorProcess(char strScrNum[], int iOpNum)

 {

 int iTemp = 0;

 char *cpCurr;

 

 if (!strlen(strScrNum))

 {

 printf("你没有输入数据!");

 return FALSE;

 }

 for (cpCurr = strScrNum; *cpCurr != '\0'; cpCurr++)

 {

 if (!(*cpCurr == ' ' || *cpCurr == ',' || *cpCurr == ';'

|| *cpCurr == '-' || *cpCurr == '+'

|| ('0' <= *cpCurr && *cpCurr <= '9'))

|| (*(cpCurr + 1) == '\0' && *cpCurr != ';')

|| (*(cpCurr + 1) == '+' && *cpCurr == '-')

|| (*(cpCurr + 1) == '-' && *cpCurr == '+')

|| (*(cpCurr + 1) == '-' && *cpCurr == '-')

|| (*(cpCurr + 1) == '+' && *cpCurr == '+'))

{

printf("\n出现非法输入 1!\n");

return FALSE;

}

if (*cpCurr == ';') iTemp++;

}

if (iTemp != iOpNum) return FALSE;

 

return TRUE;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -