Добавление значений в калькулятор связанных списков - PullRequest
1 голос
/ 13 апреля 2011

Я работаю над одним калькулятором связанных списков в C (да, это домашняя работа). У меня есть функции добавления, «работающие», но по какой-то причине я могу добавить только два значения одинаковой длины. Я не могу понять, как добавить что-то вроде 12 + 128. В настоящее время мой код принимает только 120 + 128. Что я сделал не так, как я могу исправить этот код?

struct digit* add(struct digit *x, struct digit *y)
{
    int carry = 0;
    struct digit *xHead;
    struct digit *yHead;
    struct digit *totalHead;
    struct digit *current_Digit;

    xHead = x;
    yHead = y;
    totalHead = NULL;


    while(x != NULL && y != NULL)
    {
        current_Digit = (struct digit *)malloc(sizeof(struct digit));
        current_Digit->value = x->value + y->value + carry;

        //calculates the carry
        carry = 0;
        if(current_Digit->value > 9)
        {
            carry = 1;
            current_Digit->value = current_Digit->value % 10;
        }
        else
        {
            carry = 0;
        }
        current_Digit->next = totalHead;
        totalHead = current_Digit;

        x = x->next;
        y = y->next;
    }
    return totalHead;
}

Ответы [ 3 ]

3 голосов
/ 13 апреля 2011

Вместо одновременного перехода к x->next и y->next ваша функция должна выполнять следующие действия:

while (x != NULL || y != NULL) {
    // malloc

    current_Digit->value = (x ? x->value : 0)
                         + (y ? y->value : 0)
                         + carry;

    // compute

    if (x) x = x->next;
    if (y) y = y->next;
}

(Выглядит так, как будто вы строите свой список результатов в обратном направлении ...)

2 голосов
/ 13 апреля 2011

Вы в настоящее время увеличиваете цифры обоих аргументов, не смотря на то, достигли ли вы конца одного из них.Вам необходимо провести специальный тест, который, если в конце находится только один связанный список, не увеличивайте его и просто предполагайте, что его цифровое значение равно нулю.

Таким образом, 12 + 128 должно быть динамически сделано как [0]12 + 128.Вы должны добавить логику, чтобы признать, что значение x в этом случае достигло конца своих цифр, а значение y - нет.Так что продолжайте с y и заклинайте ноль для цифры x.

0 голосов
/ 13 апреля 2011

Вы должны убедиться, что x и y имеют одинаковое количество цифр, в противном случае вы получите либо значение NULL.Перед добавлением найдите самый короткий и добавляйте к нему нули, пока не совпадете с длиной другого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...