赞
踩
建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的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;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。