题目描述:
建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。
问题分析:
①建链表:二进制数可用带头结点的单链表存储,第一个结点存储二进制数的最高位,依次存储,最后一个结点存储二进制数的最低位。
②根据二进制加法规则:实现二进制数 加1运算,方向从低位往高位找到第一个值为0的位,,从该位开始,对后面所有低位进行求反运算。
③链表实现二进制加1时,从高位往低位与运算方向正好相反,从第个结点开始找 ,找出最后一个值域为0的结点,把该结点值域赋为1,其后所有结点的值域赋为0。
④若在链表中未找到值域为0的结点,则表示该二进制数各位均为1,此时,申请一新结点,值域为1,插人到头结点与原链表的第一个结点之间,成为新链表的第一个结点,其后所有结点的值域赋为0。
代码展现:
函数部分:
Linklist *plus_one(Linklist *L)
{
Linklist *p,*s=NULL;
p=L->next;//p指针遍历
while(p != NULL)
{
if(p->data == 0)//s(指向二进制数中为零的最低位次)随着p指针的后移 不断更新
{
s=p;
}
p=p->next;
}
if(s != NULL)
{
s->data=1;
s=s->next;
while(s != NULL)
{
s->data = 0;
s=s->next;
}
}
else
{ //在头结点与首元节点插入一节点
s = new Linklist;
s->data = 1 ;
s->next=L->next;
L->next=s;
L->data++;
//其余节点值为0
p=s->next;
while(p != NULL)
{
p->data=0;
p=p->next;
}
}
return L; }
主函数:
Linklist *L,*p;
cout<<" 用链表实现二进制加一:"<<endl;
for(int i=0;i<4;i++)
{
L = create_Linklist();
int len=1;
while( len<=L->data)
{
cout<<get_Linklist(L,len)->data;
len++;
}
cout<<"+1=";
L=plus_one(L);
len=1;
while(len<=L->data)
{cout<<get_Linklist(L,len)->data;
len++;}
cout<<endl;
}
效果展示: