当前位置:   article > 正文

创建带头结点单链表实现二进制数加1的运算_二进制数末位+1

二进制数末位+1

题目描述:

     建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位。在此链表上实现对二进制数加1的运算,并输出运算结果。

     测试数据1: 1010011

     测试数据2:    1111

题目分析:

(1)二进制数加1

      若末位是1则加1后变为0,然后向前进位,如果前面一位还是1则将其变为0,继续向前进位,直到遇到数值为0的位,将其变为1。若末位是0则直接变为1即可。  例如:1011+1=1100  1010+1=1011 

根据二进制数加1的规律,我们可以看出二进制数加1就是在二进制数中找到最后一个值为0的位,将其值置为1,然后然它后边的所有位的值都为0。如果没有值为0的位,就将这个二进制数所有位置为0,然后在最前边加一位值为1的位。 例如:1111+1=10000

(2)单链表实现二进制数加1

 根据二进制数加1的规律,我们就可以利用链表实现。有如下两种情况:

①遍历单向链表若能找到最后一位值为0的结点,就将其值置为1,然后让它后边所有结点的值置为0。

②遍历单向链表若找不到值为0的结点,就新创建一个结点,其值置为1并且让这个结点插入到头结点后的位置,然后将链表中剩下的所有结点的值置为0。

代码:

单向链表加1算法代码:

  1. void addBinary(LinkList &L){
  2. LNode *p, *s, *q=NULL;
  3. p = L->next;
  4. while (p!=NULL) //找出链表L中最后一个data域为0的结点
  5. {
  6. if (p->data == 0) q = p;
  7. p=p->next;
  8. }
  9. if (q != NULL){ //链表L中存在一个data域为0的结点,则将其置1,之后的结点置0
  10. q->data = 1;
  11. q = q->next;
  12. while (q != NULL){
  13. q->data = 0;
  14. q = q->next;
  15. }
  16. }
  17. else //链表L中所有的data域都为1,则完成二进制加法时只需要在链表前插入一个值为1的结点,然后将链表中剩下的结点置0
  18. {
  19. s = (LinkList)malloc(sizeof(LNode));
  20. s->data = 1;
  21. s->next = L->next;
  22. L->next = s;
  23. p = s->next;
  24. while (p!=NULL)
  25. {
  26. p->data = 0;
  27. p = p->next;
  28. }
  29. }
  30. //输出
  31. p = L->next;
  32. while (p!=NULL)
  33. {
  34. printf("%d", p->data);
  35. p = p->next;
  36. }
  37. }

带头结点单向链表创建的代码:

  1. typedef struct LNode{
  2. int data;
  3. struct LNode *next;
  4. }LNode,*LinkList;
  5. void createLinkList(LinkList &L){
  6. char ch;
  7. LNode *p, *s;
  8. L = (LinkList)malloc(sizeof(LNode));
  9. L->next = NULL;
  10. s = L;
  11. while (1)
  12. {
  13. scanf("%c", &ch);
  14. if (ch == '\n') break;
  15. p = (LinkList)malloc(sizeof(LNode));
  16. p->next = NULL;
  17. p->data = ch - '0';
  18. s->next = p; //尾插法创建
  19. s = p;
  20. }
  21. }

 

结果输出:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/63461
推荐阅读
相关标签
  

闽ICP备14008679号