Как я могу изменить порядок связанного списка? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь распечатать результаты связанного списка в обратном порядке, в котором они были введены. Программа принимает 3 ввода, название песни, длину песни (в секундах) и авторское право.Программа должна взять список песен и распечатать их в обратном порядке, в котором они были введены.

Я не слишком знаком со связанным списком.Я впервые использую его как базу данных.

#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)

//defining struct
typedef struct node
{
char songName[20];
int songLength;
int copyright;
struct node * next;
}node;

//defining prototypes
node *create(int n);
void display(node *head);


int main()
{
    int n = 0;

    node *head = NULL;

    printf("How many entries?\n");
    scanf("%d", &n);

    //call to create list
    head = create(n);

    printf("\nThe linked list in order is:\n");
    display(head);

return 0;
}

node *create(int n)
{
node *head = NULL;
node *temp = NULL;
node *p = NULL;

for (int i = 0; i < n; i++)
{
    temp = (node*)malloc(sizeof(node));
    printf("What is the name of song %d\n", i + 1);
    //fgets(temp->songName, 20, stdin);
    scanf("%s", &temp->songName);

    printf("What is the length of song %d (in seconds)?\n", i + 1);
    scanf("%d", &temp->songLength);

    printf("Is song %d copyrighted?(1 = YES, 0 = NO)\n", i + 1);
    scanf("%d", &temp->copyright);

    temp->next = NULL;

    if (head == NULL)
    {
        head = temp;
    }
    else
    {
        // if not empty, attach new node at the end
        p = head;

        while (p->next != NULL)
        {
            p = p->next;
        }
        p->next = temp;
    }
}
return head;
}

void display(node *head)
{
    node *p = NULL;

    if (head == NULL)
    {
        printf("List is empty\n");
    }
    else
    {
            p = head;
        while (p != NULL)
        {
        printf("Song: %s, ", p->songName);
        printf("%d minutes, ", p->songLength);
        if (p->copyright == 1)
        {
            printf("Copyrighted\n");
        }
        else if (p->copyright == 0)
        {
            printf("No copyright\n");
        }
            p = p->next;
    }
}
}

Так что если введите следующее:

Song 1 - All Star (название песни), 237 (секунд), 0(без авторских прав)

песня 2 - Crab Rave, 193, 0

песня 3 - 7 колец, 185, 1 (авторские права)

Выходные данные должны быть:

7 колец, 185, 1

Crab Rave, 193, 0

All Star, 237, 0

1 Ответ

0 голосов
/ 30 января 2019

Если у вас есть один (прямой) связанный список, вероятно, самый простой способ напечатать его в обратном порядке - использовать рекурсию:

void display_recursive(node *n) {
    if (!n) {
      return;
    }
    display_recursive(n->next);
    printf("Song: %s, ", n->songName);
    ...
}

Рекурсия означает, что функция вызывает себя (до некоторойусловие, якорь, достигнута).Таким образом, поток программы будет создавать «стек» вызовов функции display_recursive-функции с первым узлом, затем вторым узлом, ..., пока он не достигнет последнего узла;к тому времени рекурсия останавливается, и часть print display_recursive обрабатывается, начиная с последнего узла назад.

Надеюсь, это объяснение поможет;Попробуйте в отладчике посмотреть, что получится.

...