Почему insertBeg не вставляет узел в начале - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь использовать insertBeg для вставки узла в начале, но я не могу сделать это правильно

#include <stdlib.h>
#include <stdio.h>

struct node {
    int data;
    struct node  *next;
}*init;

int length(struct node *n);
struct node *searchVal(struct node *n, int val);
struct node *createLinkedList(int data);
struct node *insertEnd(struct node *n, int data);
struct node *insertBeg( struct node *n, int data);
void printList(struct node *n);

int main(int argc, char **argv) {
    init = createLinkedList(1);
    insertEnd(init, 6);
    insertBeg(init, 9);
    printList(init);
}

void printList(struct node *n) {
    if (n != NULL) {
        while (n->next != NULL) {
            n = n->next;
            printf("%d", n->data);
        }
    } else {
        printf("Empty List");
    }
}

/**
 *  returns length of node
 */
int length(struct node *n) {
    int count = 0;
    if (!n) {
        return 0;
    }

    struct node *ptr = n;
    while(ptr != NULL) {
        count = count + 1;
        ptr = ptr->next;
    }
    return count;
}

struct node *searchVal(struct node *n, int val) {
    struct node *pos;
    if (!n) {
        return NULL;
    }


    struct node *ptr = n;
    while (ptr != NULL) {
        if (val == ptr->data){
            pos = ptr;
            return pos;
        } else {
            ptr = ptr->next;
        }
    }
    return NULL;
}

struct node *createLinkedList(int data) {
    struct node *new_node;
    new_node = (struct node *)malloc(sizeof(struct node));

    if (new_node == NULL) return NULL;
    new_node->data = data;
    new_node->next = NULL;

    return new_node;
}

struct node *insertBeg(struct node *n, int data) {
    struct node *new_node;
    new_node = (struct node *)malloc(sizeof(struct node));
    if (new_node == NULL) {
        return NULL;
    }

    new_node->data = data;
    new_node->next = n;
    n = new_node;
    return n;
}

struct node *insertEnd(struct node *n, int data){
    struct node *new_node, *temp;
    new_node = (struct node *)malloc(sizeof(struct node));

    if (new_node == NULL) {
        return NULL;
    }

    new_node->data = data;
    if (n == NULL) {
        new_node->next = NULL;
        temp = new_node;
    } else {
        temp = n;
        while (temp->next != NULL) {
            temp = temp->next;
            temp->next = temp;
        }
        temp->next = new_node;
        new_node->next = NULL;
    }
    return temp;
}

Ответы [ 2 ]

3 голосов
/ 20 июня 2019

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

int main(int argc, char **argv) {
    struct node * newHeader;
    init = createLinkedList(1);
    insertEnd(init, 6);
    newHeader = insertBeg(init, 9);
    init = newHeader;
    printList(init);
}

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

void printList(struct node *n) {
    if (n != NULL) {
        while (n != NULL) {
            printf("%d", n->data);
            n = n->next;
        }
    } else {
        printf("Empty List");
    }
}

Вы можете увидеть полный код здесь для справки: https://ideone.com/WX9TKF

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

Функция insertBeg верна и возвращает новый начальный элемент вашего связанного списка, который вы пометили как init.

Таким образом, вместо

insertBeg(init, 9);

вызовите в вашей основной функции , поставьте это

init = insertBeg(init, 9);

Это решит вашу проблему.

Кроме того, ваша функция выглядит нормально.

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