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

题目描述:

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

结果输出:

猜你喜欢

转载自blog.csdn.net/weixin_42070473/article/details/105714436