Кажется, не может получить функцию печати в связанном списке в C - PullRequest
0 голосов
/ 27 июня 2019

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

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

typedef struct node{

    int data;
    struct node *next;

}node;

node *head = NULL;

void print(node *head){

    node *temp = head;

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

    printf("NULL");

}

node *clist(int n){

    node *temp = NULL;
    node *p = NULL;
    int i;

    for(i=0;i<n;i++)
    {
        temp = (node*)malloc(sizeof(node));

        printf("Enter the elements of the list.\n");
        scanf("%d",&temp->data);
    }

    if(head!=NULL)
    {
        while(p->next!=NULL)
        p=p->next; //shifting p here node by node

        p->next = temp; //last node which was just created
    }

    else
    {
        head = temp;
    }

    return head;
}

node *binsert(int x){

    node *temp = NULL;
    node *p = NULL;

    temp = (node*)malloc(sizeof(node));

    if(head!=NULL)
    {
        temp->next = head;
        temp = head;
    }

    else
    {
        p = head = temp;
    }

    return head;
}

int main ()
{
    int a, s, i, n,f;

    printf("Choose an option : \n1.Create a list.\n2.Exit.\n");
    scanf("%d",&s);

    switch(s)
    {
        case 1: 
            printf("Very Well! Input the number of nodes\n");
            scanf("%d",&n);
            head = clist(n);
            printf("Link List created successfully.\n");
            print(head);
            break;

        default:
            exit (0);           
    }

    printf("Choose the operation you want to perform on the linked list:\n1.Add an element to the beginning.\n2.Add an element to the end.\n3.Add an element at a a particular position.\n");
    scanf("%d",&a);
    switch(a)
    {
        case 1:
            printf("Enter the element you want to insert at the beginning.\n");
            scanf("%d",&f);

            binsert(f);
            printf("Inserted Successfully.\n");
            print(head);

            break;

        case 2:
            printf("Error E162B");
    }

    return 0;

}

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

1 Ответ

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

Первый:

for(i=0;i<n;i++)
{
    temp = (node*)malloc(sizeof(node));

    printf("Enter the elements of the list.\n");
    scanf("%d",&temp->data);
}

Этот цикл повторяется несколько раз, чтобы пользователь мог вводить элементы списка.Но он никогда не добавляет ни одного узла в связанный список.Каждая итерация цикла изменяет temp, указывая на вновь выделенный узел, но не добавляет узлы в связанный список.

Секунда:

while(temp!=NULL);

Это бесконечныйцикл прямо здесьЕсли temp не равно NULL, оно нигде в цикле не изменяется, поэтому оно никогда не станет NULL.Тебе не нужна эта точка с запятой.

Третье:

node *head = NULL;

void print(node *head){

   node *temp = head;

Не делай этого с собой.У вас есть глобальная переменная с именем head, а у вас есть параметр с именем head.Когда вы делаете node *temp = head;, насколько очевидным является , к которому относится head.Не давайте двум переменным одно и то же имя, если их область видимости перекрывается.

Четвертый:

if(head!=NULL)
{
    temp->next = head;
    temp = head; // **** here
}

else
{
    p = head = temp;
}

return head;

Какой смысл temp = head;?Значение temp нигде не доступно.Так что это не может быть правдой.

Наконец:

Я думаю, что вы не задали правильный вопрос, хотя.Вы попросили нас объяснить, где вы идете не так, и я сделал это.Но я не думаю, что это то, что вам действительно нужно.Может быть, вам нужна помощь в разработке алгоритма для решения проблемы?Возможно, задайте новый вопрос, описывающий, каким, по вашему мнению, должен быть алгоритм (просто словами, не нужно использовать код), и попросите помощи в его исправлении.Вы пытаетесь выполнить задачу, которая значительно превышает ваши знания.Это расстраивает и не очень хороший способ научиться программированию.Вы должны серьезно подумать о том, чтобы сначала попытаться выполнить более простые задачи.

Возможно, вы упростили его для упрощения вопроса, но ваш реальный код должен содержать лотов дополнительных проверок и журналов, чтобы помочь вам понять его.,Вход, когда вы вводите функцию.Записывайте каждое решение, которое принимает функция.Журнал, какие функции возвращают.Это поможет вам определить, где фактическая работа программы отклоняется от того, что, по вашему мнению, должно происходить.Или, если хотите, научитесь использовать средства отладки вашей платформы.Таким образом, вы не будете вносить случайные изменения и надеяться, что они заставят все работать, но вместо этого будете знать, где код вначале работает неправильно, и сможете исправить одну вещь за один раз, будучи уверенными, что вы не нарушаете работающие вещи.

...