Reputation: 13
I am working on a single linked-list calculator in C (yes, it's homework). I have the add functions "working" but for some reason I can only add two values that are the same length. I can't really figure out how to add something like 12 + 128. Currently my code only accepts 120 + 128. What did I do wrong, how can I fix this code?
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;
}
Upvotes: 1
Views: 692
Reputation: 363607
Instead of going to x->next
and y->next
simultaneously, your function should do the following:
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;
}
(It also looks as if you're constructing your result list backwards...)
Upvotes: 3
Reputation: 22979
You should ensure x
and y
have the same number of digits, otherwise you'll end up with either set to NULL
. Before adding, find the shortest and add zeros to it until you match the other's length
Upvotes: 0
Reputation: 37930
You're currently incrementing the digits of both arguments without looking at whether you've hit the end of one of them. You need to have a special test that if only one linked list is at its end, then don't increment it and just assume its digit value is zero.
So 12 + 128
should be dynamically made as [0]12 + 128
. You must add logic to recognize that the x
value in this case has reached the end of its digits but the y
has not. So keep going with the y
and conjure zero for the x
digit.
Upvotes: 2