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

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

Как мне это сделать при переработке моего предыдущего кода.Есть ли способ сделать это с минимальными шагами?

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


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

//prototypes
node *create(int n);
void display_recursive(node *n);


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_recursive(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);
        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_recursive(node *n) {
    if (!n) {
        return;
    }
    display_recursive(n->next);

    printf("Song: %s, ", n->songName);
    printf("%d minutes, ",n->songLength);
    if (n->copyright == 1)
    {
        printf("Copyrights\n");
    }
    else if (n->copyright == 0)
    {
        printf("No copyrights\n");
    }
}

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

Ответы [ 3 ]

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

Как и в случае @ T1412, вам нужно добавить новый элемент в структуру.

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

теперь вам нужно изменить функцию create (), чтобы указатель prev каждого узла указывал на предыдущий узели prev узла узла HEAD указывает на NULL.

Аналогично, вам нужно изменить все связанные функции связанного списка, чтобы включить указатель prev.

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

1) настоятельно рекомендуем изменить:

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

на:

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

Затем в любом месте кода, который он связывает в новом узле, добавьте необходимый оператор, чтобы установить«Предыдущее» поле.Помните, что узел firs будет содержать NULL в поле 'prior'.

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

Вам просто нужен указатель на предыдущий узел

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