美文网首页
链表模拟二进制加法及C#的实现

链表模拟二进制加法及C#的实现

作者: 周末的游戏之旅 | 来源:发表于2019-08-02 15:30 被阅读0次

问题分析

  1. 建链表:
    二进制数可用带头节点的单链表存储,第一个节点存储二进制数的最高位。
  2. 二进制数加1运算规则:
    从低位往高位找到第一个位0的位置,把该位改为1,其后所有各位改为0。
    1010
    +1
    ————
    1100
  3. 链表实现方法:从高位往低位拉,从第一个节点开始,找出最后一个值域为0的节点,把该节点值域赋为1,其后所有节点的值域赋为0。
  4. 若在链表中未找到值域为0的节点,则表示该二进制数各位均为1,此时,申请一个新节点,值域置为1,头插入到原链表,其后所有节点的值域置为0

1111
+1
————
10000

算法描述

Node

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace b
{
    class Node<T>
    {
        T data;
        Node<T> next;

        public T Data { get => data; set => data = value; }
        internal Node<T> Next { get => next; set => next = value; }

        public Node()
        {
            Data = default(T);
            Next = null;
        }

        public Node(T data)
        {
            this.Data = data;
        }
    }
}

Program

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace b
{
    class Program
    {
        static void Main(string[] args)
        {
            Node<char> head = new Node<char>();
            Node<char> a1 = new Node<char>('1');

            head.Next = a1;
            BinAdd(head);
            BinAdd(head);

            while (head.Next != null)
            {
                head = head.Next;
                Console.WriteLine(head.Data);
            }
        }

        static void BinAdd(Node<char> h)
        {
            Node<char> q = h.Next;
            Node<char> l = h;

            //遍历出最后一个0
            while (q.Next != null)
            {
                if (q.Data == '0') l = q;
                q = q.Next;
            }

            //至少有一个0,找到最后一个0,改为1,后面全部置为0
            if (l != h)
            {
                l.Data = '1';
                l = l.Next;
                while (h.Next != null)
                {
                    h.Data = '0';
                    h = h.Next;
                }
            }
            //头插入1,后面全部置为0
            else
            {
                Node<char> a = new Node<char>('1'); //新建节点
                //头插入
                a.Next = h.Next;
                h.Next = a;

                h = h.Next.Next;
                while (h.Next != null)
                {
                    h.Data = '0';
                    h = h.Next;
                }
            }
        }
    }
}

相关文章

  • 链表模拟二进制加法及C#的实现

    问题分析 建链表:二进制数可用带头节点的单链表存储,第一个节点存储二进制数的最高位。 二进制数加1运算规则:从低位...

  • C# 链表

    链表介绍 Unity 用C#写的链表类 简述链表和数组的区别 Unity--链表实现贪吃蛇

  • 静态链表及C#实现

    静态链表 静态链表是用数组模拟动态链表。 静态链表结构描述 首先,静态链表使用数组来模拟动态链表。数组存放一个节点...

  • 链表分割及C#实现

    问题分析 已知一个带头节点的单链表L,将比首节点大的放在首节点前面,否则放在首节点后面 算法描述 Node类 Pr...

  • 单链表及C#的实现

    链表结构如下: C#代码实现如下: Node类 实现节点,包括节点中的数据域和指针域。 IListDs接口 规定链...

  • 双向链表及C#的实现

    双向链表图解 程序实现 下面的实现中没有使用头节点(即头节点就是首节点) Node类 DoubleList类 Pr...

  • LeetCode 67. Add Binary

    使用数组模拟两个二进制字符串加法,使用字符c标记当前位字符。

  • 单向循环链表及C#的实现

    循环链表 循环链表是指链表的尾节点的Next指针域指向头节点。循环链表判空条件,头节点的后继指向自己。 代码实现 ...

  • Redis数据结构学习-链表(二)

    链表 链表提供了高效的节点重排能力, 及顺序性节点访问方式, Redis构建了自己的链表实现 链表和链表节点的实现...

  • 【加法笔记系列】JS 加法器模拟

    JS 加法器模拟,实现 半加器 全加器 波纹进位加法器 全部代码 补码 & 减法 常规位运算 位运算 & 简单的 ...

网友评论

      本文标题:链表模拟二进制加法及C#的实现

      本文链接:https://www.haomeiwen.com/subject/sgvldctx.html