问题三:
二进制加法问题
举例:二进制数110101,首先将二进制数的每一位存入链表:
L->1->1->0->1->0->1->NULL
加一后,链表应该变为:
L->1->1->0->1->1->0->NULL
(一)题目解析
首先,一拿到这个题目,很懵。
需要找规律,找到规律后才能进行算法书写
其实规律为:
找到二进制数的最后一个为0的位,然后把该0位变成1,其后面的各位都变成0;
例如:
若二进制数全0,就是把最后一个0位变成1,其他不变;
若二进制数全1,也就没有0位,则在在二进制数前加一位,值为1,原来的二进制数全变为0;
这样我们就找到了这个二进制的规律了
(二)与链表的操作相对应
首先需要对链表进行遍历,找到二进制数中的0的情况。
其次,
在全为1的时候就是一个简单的插入,然后改值的操作;
在非全1的情况下,就是直接的改值操作;
(三)代码实现
/* 二进制数的加法 */
#include <stdio.h>
#include <stdlib.h>
typedef struct code
{
int data;
struct code *next;
} Code;
void addOne();
Code *block(int data);
Code *create(int a[], int length);
int lookAll(Code *Head);
int main()
{
int a[] = {1, 1, 0, 1, 1, 1, 1};
int length = 7;
Code *Head = create(a, length);
printf("%s", "before: ");
lookAll(Head);
printf("\n");
printf("%s", "now: ");
addOne(Head);
lookAll(Head);
}
void addOne(Code *Head)
{
Code *HeadSave = Head;
Code *temp = NULL;
while (Head != NULL)
{
if (Head->data == 0)
{
temp = Head;
}
Head = Head->next;
}
if (temp == NULL)
{
Code *a1 = block(1);
Code *a = Head->next;
Head->next = a1;
a1->next = a;
while (a != NULL)
{
a->data = 0;
a = a->next;
}
}
else
{
temp->data = 1;
Code *a = temp->next;
while (a != NULL)
{
a->data = 0;
a = a->next;
}
}
}
Code *block(int data)
{
Code *a = (Code *)malloc(sizeof(Code));
a->data = data;
a->next = NULL;
return a;
}
Code *create(int a[], int length)
{
Code *q = (Code *)malloc(sizeof(Code));
q->data = NULL;
Code *Head = q;
for (int i = 0; i < length; i++)
{
Code *p = (Code *)malloc(sizeof(Code));
q->next = p;
p->data = a[i];
p->next = NULL;
q = p;
}
return Head;
}
int lookAll(Code *Head)
{
Head = Head->next;
while (Head != NULL)
{
int i = 0;
printf("%d\0", Head->data);
Head = Head->next;
i++;
}
return 0;
}