链表(提高)-数据结构(三)

问题三:

二进制加法问题

举例:二进制数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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值