Добавление двух чисел, хранящихся в виде связанного списка - невозможно решить с помощью C - PullRequest
0 голосов
/ 17 июня 2019

Я понял проблему, но не могу решить ее в «C».

struct ListNode* newnode(struct ListNode* node, int data) {
    struct ListNode* temp = node;
    struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));    
    while (temp->next != NULL) {
        temp = temp->next;
    }
    temp->next = newnode;
    newnode->next = NULL;
    newnode->val = data;
    return newnode;
}  

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* l;
    struct ListNode* temp = l;

    int carry = 0;
    while (l1 != NULL || l2 != NULL) {
        int sum = 0;
        if (l1 != NULL) {
            sum += l1->val;
            l1 = l1->next;
        }
        if (l2 != NULL) {
            sum += l2->val;
            l2 = l2->next;
        }
        if (sum >= 10) {    
            temp  = newnode(l, carry);
            carry = sum % 10;
        }
        else {
            temp = newnode(l, carry + sum);
        }
    }       
    return l;
}

Получение ошибки времени выполнения: доступ к элементу в нулевом указателе типа «struct ListNode» (solution.c).Я запустил функцию 'newnode' отдельно, которая отлично работает.

Нужна помощь, только новичок.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Если оставить в стороне управление переносом и создание нового узла, вот возможный ответ о том, как добавить два числа, хранящиеся в виде связанного списка:

typedef struct l{
    int val;
    struct l *next;
}List;

List * add(List *a, List *b){
    List *sum = NULL;
    if(a != NULL && b != NULL){
        sum = malloc(sizeof(List));
        sum->val = a->val + b->val;
    } 
    return sum;
}

int main(void){
    List *a = malloc(sizeof(List));
    List *b = malloc(sizeof(List));
    List *s = malloc(sizeof(List));
    a->val = 3;
    b->val = 8;
    s = add(a,b);
    printf("%d + %d = %d\n", a->val, b->val, s->val);
    return 0;
}
0 голосов
/ 17 июня 2019

Обработка добавления нового узла в пустые списки:

struct ListNode* newnode(struct ListNode* node, int data){

    struct ListNode* temp = node;
    struct ListNode *newnode = (struct ListNode*)malloc(sizeof(struct ListNode));

    if(temp == NULL){
       newnode->val = data;
       newnode->next = NULL;
       return newnode;
    }
    while(temp->next != NULL){
        temp = temp->next;
    }
    temp->next = newnode;
    newnode->next = NULL;
    newnode->val = data;

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