Может кто-нибудь проверить, что происходит с функцией inserttatend .. она не создает все блоки, упомянутые в основной функции - PullRequest
0 голосов
/ 09 сентября 2018

Я добавил оператор печати в цикл if else функции inserttatend и inertatfront, это привело к тому, что оператор printf печатался каждый раз, когда я вызывал обе функции из main ..., но при отображении он отображает не все значения. Я думаю, что, возможно, узлы где-то ломаются во время вызова ... Смотрите вывод ниже кода. Он показывает только три значения, в то время как он должен отображать все значения, которые я ввел в main (). Вот мой код ..

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

struct node
{
    int value;
    struct node* ptr;
};

struct node* insertatend(struct node* h, int value)
{
    struct node* newnode;
    newnode = (struct node*)malloc(sizeof(struct node));
    newnode->value = value;
    newnode->ptr = NULL;

    if (h == NULL)
        return newnode;
    else {
        while(h->ptr!=NULL)
        h=h->ptr;
        h->ptr = newnode;
        return h;
    }
}

struct node* insertatfront(struct node* h, int value)
{
    struct node* newnode;
    newnode = (struct node*)malloc(sizeof(struct node));

    if (h == NULL) {
        newnode->value = value;
        newnode->ptr = NULL;
        return newnode;
    }
    else
    {
        newnode->value = value;
        newnode->ptr = h;
        return newnode;
    }
}

void display(struct node* h)
{
    while ((h->ptr) != NULL)
    {
        printf("The value stored in the block is %d\n", h->value);
        h = h->ptr;
    }

    if (h->ptr == NULL)
        printf("The value stored in the block is %d\n", h->value);
}

void main()
{
    struct node* head;

    head = (struct node*)malloc(sizeof(struct node));

    head = insertatend(head, 90);
    head = insertatend(head, 30);
    head = insertatfront(head, 5);
    head = insertatend(head, 12);
    head = insertatend(head, 1);
    head = insertatfront(head, 25);
    display(head);
}
/* Output:The value stored in block is 25
 * The value stored in block is 5
 * The value stored in block is 1
 */

1 Ответ

0 голосов
/ 10 сентября 2018

Основные ошибки, которые вы, кажется, делаете в своем коде:

1) изменение указателя head в функции вставки. Это утверждение в insertatend:

while(h->ptr!=NULL)
    h=h->ptr;

меняет заголовок самого списка. Вместо этого вы должны использовать другой указатель для перемещения до конца. Измените insertatend на:

struct node* insertatend(struct node* h, int value)
{

    struct node* newnode;
    newnode = (struct node*)malloc(sizeof(struct node));
    newnode->value = value;
    newnode->ptr = NULL;

    if (h == NULL){
        h=newnode;

    }
    else {
        struct node *temp;
        temp=h;
        while(temp->ptr!=NULL) temp=temp->ptr;
        temp->ptr = newnode;
    }
    return h;
}

2) Случай, когда h равен NULL, никогда не произойдет, так как вы уже набрали номер head в main. Удалить оператор head = (struct node*)malloc(sizeof(struct node)); из main

...