如何将单链表更改为双链表?

时间:2019-01-30 02:40:47

标签: c linked-list singly-linked-list doubly-linked-list

我有一个程序,应该将其从单链列表更改为双链列表。这意味着我使用指向下一个节点的指针和指向上一个节点的指针。

在回收以前的代码时,我该怎么做。有没有办法以最少的步骤做到这一点?

#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 :(得分:0)

您只需要指向上一个节点的指针

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

答案 1 :(得分:0)

就像@ T1412所说的那样,您需要在结构中添加一个新成员。

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

现在您需要修改create()函数,以便每个节点的prev指针都指向上一个节点,而HEAD节点的prev指向NULL。

类似地,您需要修改所有与链表相关的功能以合并prev指针。

答案 2 :(得分:0)

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;

然后在新节点中所链接的代码中的任何地方,添加必要的语句以设置“ prior”字段。请记住,firs节点的“ prior”字段中将包含NULL。