Связанные списки (очень интро) InsertBack - PullRequest
0 голосов
/ 20 апреля 2020
#include <stdio.h>
#include <stdlib.h>

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

node* insertFront(node* head, int d);
node* insertBack(node* head, int d);
void print(node* head);
int max(node* head);
int min(node* head);
int locInList(node* head, int x);

int main()
{
    node* head = NULL;
    node* temp = NULL;

    head = malloc(sizeof(node));

    head = insertBack(head, 5); 
    head = insertFront(head, 4);
    head = insertFront(head, 3);
    head = insertBack(head, 6);
    head = insertBack(head, 7);
    print(head);

    printf("\nMax: %d\n", max(head));
    printf("Min: %d\n", min(head));
    printf("locInList 5: %d\n", locInList(head, 5));
    printf("locInList 9: %d\n", locInList(head, 9));    
    return 0;
}

node* insertFront(node* head, int d)
{
    node *tmp = NULL;

    tmp = malloc(sizeof(node));
    tmp->data = d;
    tmp->next = head;
    head = tmp;

    return head;
}

node* insertBack(node* head, int d)
{
    node *ptr;
    ptr->data=d;
    ptr->next = NULL;

    if(head==NULL)
    {
        head->data=d;
        head->next=NULL;
    }
    else
    {
        node *temp=head;
        while(temp->next != NULL)
        {
            temp=temp->next;
        }

        temp->next=ptr;

    }
    return head;
}

void print(node* head)
{
    node *tmp = head;

    while(tmp != NULL)
    {
        printf("%d ", tmp->data);
        tmp = tmp->next;
    }

}

int max (node* head)
{
 int max;
 while (head != NULL)
 {
     if (max > head->data)
     max = head->data;

 }
 return max;
}

int min (node* head)
{
 int min;
 while (head != NULL)
 {
     if (min < head->data)
     min = head->data;

 }
 return min;
}

int locInList(node* head, int x)
{

}

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

Текущий вывод, который я получаю с этим кодом:

3 4 0 7 7 7 7 7 7 7 ... повтор

Вывод должен выглядеть следующим образом

34567 Макс .: 7 Мин: 3

Буду признателен за любую помощь. Я также очень новичок в связанных списках. Так что любая помощь будет очень признательна !!

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Для начала это утверждение в начале main

head = malloc(sizeof(node));

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

Удалите этот оператор.

Вы забыли выделить память для узла в функции insertBack.

node* insertBack(node* head, int d)
{
    node *ptr;
    ptr->data=d;
    ptr->next = NULL;
    //...

Также тело оператора if

if(head==NULL)
{
    head->data=d;
    head->next=NULL;
}

не имеет смысла.

Если оставить объявление функции как Тогда его определение может выглядеть следующим образом:

node * insertBack( node *head, int d )
{
    node *ptr = malloc( sizeof( node ) );

    ptr->data = d;
    ptr->next = NULL;

    if ( head == NULL )
    {
        head = ptr;
    }
    else
    {
        node *temp = head;
        while ( temp->next != NULL )
        {
            temp = temp->next;
        }

        temp->next = ptr;
    }

    return head;
}

Также эти функции

int max (node* head)
{
 int max;
 while (head != NULL)
 {
     if (max > head->data)
     max = head->data;

 }
 return max;
}

int min (node* head)
{
 int min;
 while (head != NULL)
 {
     if (min < head->data)
     min = head->data;

 }
 return min;
}

недопустимы, поскольку по крайней мере переменные max и min не были инициализированы. Более того, они имеют бесконечное значение l oop, и, например, функция max не находит максимальное значение в списке .:)

Было бы лучше объявить их, например, так:

int max ( node* head, int *value );

В этом случае определение функции max может выглядеть как

int max( node* head, int *value )
{
    int success = head != NULL );

    if ( success )
    {    
        *value = head->data;

        while ( ( head = head->next ) != NULL )
        {
            if ( *value < head->data ) *value = head->data;
        }
    }

    return success;
} 

, а функция может вызываться как

int max_value;

if ( max( head, &max_value ) )
{
    printf( "The maximum value is %d\n", max_value );
}

Функция min может быть объявлена ​​и определена так же way.

Если оставить объявления функций как есть, то вы должны хотя бы инициализировать переменные равными 0. Например,

int max (node* head)
{
    int max = head == NULL ? 0 : head->data;

    for ( ; head != NULL; head = head->next )
    {
         if ( max < head->data ) max = head->data;
    }

    return max;
}

Аналогичным образом можно определить функцию min. Хотя, как я уже говорил, лучше, когда функции определены так, как я показал выше.

И не забудьте написать функцию, которая освободит всю выделенную память.

0 голосов
/ 20 апреля 2020

Здесь

node* insertBack(node* head, int d)
{
    node *ptr;
    ptr->data=d;       // Dereference uninitialized pointer !!
    ptr->next = NULL;  // Dereference uninitialized pointer !!

    if(head==NULL)
    {
        head->data=d;      // Dereference NULL pointer !!
        head->next=NULL;   // Dereference NULL pointer !!
    }

у вас есть серьезная проблема. Вы не выделяете память! Таким образом, вы разыменовываете неинициализированный указатель. Это плохо.

Попробуйте:

node* insertBack(node* head, int d)
{
    node *ptr = malloc(sizeof *ptr);
    ptr->data=d;
    ptr->next = NULL;

    if(head==NULL) return ptr;

    ...
...