链表应用----二进制数加1进位表示链表存储

之前从慕课西北大学数据结构老师那里的例题

问题描述:建立一个带头结点的线性链表,用以存放输入的二进制数,

链表的每一个data域存放一个二进制位,并在此链表上实现对二进制数加1的运算。

问题分析如图:


通俗解释就是,遍历链表找出一串二进制数最低位的0位,并记录下位置,此位置变1,后边位置的数变0,例如(1010110011)加1运算就变成(1010110011),若是111111满位1的数,就用头插法插入新结点存1,原来的链表data域全变0,111111就变成了1000000.

typedef struct Snode
{
	int data;
	Snode *next;
}Snode,*PSnode;
void BinaryAddOne(PSnode&L)
{						//链表表头到表尾依次为高位到低位 
	PSnode Temp, q, p, s;
	q = L->next;      //遍历查找的头指针
	p = L;				
	s = NULL;         //查找0位的标记指针
	while (q)
	{
		if (q->data==0)
			s = q;		//记录从最高位开始的最后一个0位的位置
		q = q->next;
	}

	if (s)
	{
		s->data = 1;	//记录的位置变为1 
		s = s->next;
		while (s)
		{
			s->data = 0;//其后边的1位全变为0
			s = s->next;
		}
	}
	else
	{//Temp 为二进制位满1时新进位空间开辟指针 形如1 3 7 15等二进制表示的下一个高位
		Temp = new Snode;
		Temp->data = 1;			//采用头插法进行新进位的添加
		Temp->next = p->next;
		p->next = Temp;
		Temp = Temp->next;
		while (Temp)				//新进位后的所有1位全变为0
		{
			Temp->data = 0;
			Temp = Temp->next;
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值