之前从慕课西北大学数据结构老师那里的例题
问题描述:建立一个带头结点的线性链表,用以存放输入的二进制数,
链表的每一个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;
}
}
}