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

本文介绍如何使用带头结点的单向链表存储二进制数,并实现加1运算。通过遍历链表找到最后一个值为0的结点,将其置1并清零后续结点,或在链表前插入新结点来处理进位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

     建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的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算法代码:


void addBinary(LinkList &L){
	LNode *p, *s, *q=NULL;
	p = L->next;
	while (p!=NULL) //找出链表L中最后一个data域为0的结点
	{
		if (p->data == 0) q = p;
		p=p->next;
	}
	if (q != NULL){     //链表L中存在一个data域为0的结点,则将其置1,之后的结点置0
		q->data = 1;
		q = q->next;
		while (q != NULL){
			q->data = 0;
			q = q->next;
		}
	}
	else                //链表L中所有的data域都为1,则完成二进制加法时只需要在链表前插入一个值为1的结点,然后将链表中剩下的结点置0
	{
		s = (LinkList)malloc(sizeof(LNode));
		s->data = 1;
		s->next = L->next;
		L->next = s;
		p = s->next;
		while (p!=NULL)
		{
			p->data = 0;
			p = p->next;
		}
	}

	//输出
	p = L->next;
	while (p!=NULL)
	{
		printf("%d", p->data);
		p = p->next;
	}
}

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

typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;
void createLinkList(LinkList &L){
	char ch;
	LNode *p, *s;
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	s = L;
	while (1)
	{
		scanf("%c", &ch);
		if (ch == '\n') break;
		p = (LinkList)malloc(sizeof(LNode));
		p->next = NULL;
		p->data = ch - '0';
		s->next = p;       //尾插法创建
		s = p;
	}
}

 

结果输出:

### 回答1: 本题可以分为以下几个步骤: 1. 从链表的末尾开始遍历,将当前结点的值1。 2. 如果1后的值小于2,则直接结束遍历。因为没有进位,已经得到了1后的二进制数。 3. 如果1后的值等于2,则将当前结点的值置为0,并继续遍历前一个结点,将其值1。 4. 如果遍历到链表的头部仍然需要进位,则需要在链表头部添一个结点,并将其值设置为1。 代码实现如下: ``` struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* addOne(ListNode* head) { ListNode *cur = head, *lastNonNine = NULL; while (cur) { if (cur->val != 9) { lastNonNine = cur; } cur = cur->next; } if (!lastNonNine) { ListNode *newHead = new ListNode(1); newHead->next = head; return newHead; } ++lastNonNine->val; cur = lastNonNine->next; while (cur) { cur->val = 0; cur = cur->next; } return head; } ``` ### 回答2: 要用单链表实现一个二进制数一,首先需要创建一个表示二进制数单链表链表中的每个节点表示一个二进制位。链表的头节点表示最低位,链表的尾节点表示最高位。 具体的实现步骤如下: 1. 初始化链表创建一个新的链表,头节点为0。 2. 从链表的尾部开始遍历,找到第一个值为0的节点,将其值设为1,并将其后面所有的节点(如果有的话)的值设为0,表示进位。 3. 如果链表的头节点的值也被修改为1,那么说明需要增一个新的节点作为头节点,并将其后面所有节点的值设为0,表示进位。 4. 最后返回链表的头节点,表示一后的结果。 以下是一个具体的实现示例: ```python def addOne(head): # 从链表的尾部向前遍历 curr = head carry = 1 # 进位标志 while curr: if curr.val + carry <= 1: curr.val += carry carry = 0 else: curr.val = 0 carry = 1 # 如果到达链表尾部仍然有进位,则添新节点 if not curr.next: curr.next = Node(0) # 创建新节点 curr = curr.next return head # 链表节点的定义 class Node: def __init__(self, val=0, next=None): self.val = val self.next = next # 创建一个表示二进制数链表 def createLinkedList(num): if num == 0: return Node(0) head = Node(num % 2) num //= 2 curr = head while num > 0: curr.next = Node(num % 2) num //= 2 curr = curr.next return head # 示例测试 head = createLinkedList(110) result = addOne(head) curr = result while curr: print(curr.val) curr = curr.next # 输出结果为: # 1 # 1 # 1 ``` ### 回答3: 单链表是一种数据结构,它由节点组成,每个节点包含了存储的元素和指向下一个节点的指针。在实现二进制数一的过程中,可以使用单链表来表示一个二进制数。 首先,我们需要定义一个节点类,其中节点的元素表示二进制数的每一位。节点类包含两个成员变量:一个整型变量来存储当前位的值,一个指向下一个节点的指针。 然后,我们可以实现一个函数,该函数将一个二进制数单链表作为参数,并将该二进制数一。函数的具体实现如下: 1. 初始化进位变量carry为1,表示要上的进位。 2. 从头节点开始遍历单链表,对每个节点执行以下操作: a. 将节点的值与carry相,并将结果保存在节点的值中。 b. 如果节点的值大于等于2,则将节点的值减去2,并将carry置为1,表示有进位。 c. 否则,将carry置为0,表示没有进位。 d. 如果当前节点不是最后一个节点,则将当前节点移动到下一个节点。 e. 如果当前节点是最后一个节点且carry为1,则创建一个新节点作为末尾节点,并将其值设置为1。 3. 返回一后的二进制数单链表。 通过以上步骤,我们就可以用单链表实现一个二进制数一的功能。需要注意的是,在实现过程中,我们需要处理进位的情况,并且在处理完最后一个节点之后还要判断carry的值,如果carry为1,则需要额外创建一个新节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值