-1
votes

Comment changer la liste liée à une liste doublement liée?

J'ai un programme que je suis censé la modifier d'une liste liée à une liste doublement liée. Cela signifie que j'utilise le pointeur qui pointe sur le nœud suivant et un pointeur qui pointe vers le nœud précédent.

Comment puis-je le faire lors du recyclage de mon code précédent. Y a-t-il un moyen de le faire avec des étapes minimales impliquées? P>

#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");
    }
}


5 commentaires

Vous devez faire vos propres devoirs. De centre d'aide : questions demandant une aide aux devoirs doit inclure un résumé du travail que vous avez Fait jusqu'à présent pour résoudre le problème et une description de la difficulté que vous avez la résolution .


@Kenwhite Je ne cherche pas de réponses. Je cherche des conseils. Ce que je demande, c'est si je devais redémarrer le code entier pour créer des listes doublement aimées ou recycler et réutiliser la liste lié.


Votre premier paragraphe de texte montre que vous savez ce que vous devez faire. Pourquoi redémarreriez-vous l'ensemble du code pour ajouter un pointeur au nœud précédent, qui rendrait la liste existante individuellement liée à une liste doublement liée?


De lire en ligne, je comprends que l'ajout d'un pointeur pour afficher le noeud précédent est la prémisse d'une DLL. Mais ce que je veux savoir, c'est comment cela affectera mon code si je choisis d'ajouter ou de supprimer un nœud dans la console. Je n'essaie pas de profiter des gens à écrire mon code si c'est ce que vous essayez de m'accuser. Je ne suis qu'un étudiant logiciel qui a du mal à comprendre comment cela fonctionne lorsque les professeurs choisissent de ne pas aider ou d'expliquer ...


En ce qui concerne: scanf ("% s", & temp-> SongName); Le champ SongName est un tableau. En C, référencer un nom de matrice dégrade à l'adresse du premier octet de la matrice. Donc, cette déclaration tente d'accéder: Char * [20] Ce qui n'est pas la même chose. Suggère fortement de supprimer le &


3 Réponses :


0
votes

Vous avez juste besoin d'un point de pointeur sur le nœud précédent xxx


2 commentaires

Est-ce tout ce qu'il faut pour en faire une liste doublement liée?


@Samueliorga vous (espérons-le évidemment) également de gérer ce pointeur membre ajouté dans les routines qui ajoutent et supprimez des nœuds dans votre liste liée. Cela montre où se passe le pointeur. Les mêmes idées pour la gestion de la liste individuellement liée doivent maintenant être étendues à l'utilisation de ce deuxième pointeur. Croyez-moi quand je dis cela: papier, un crayon, des boîtes et des flèches sont facilement votre meilleur ami dans le monde Quand il s'agit de comprendre le code que vous avez, et le ajouts que vous allez faire.



0
votes

Tout comme @ T1412 dit, vous devez ajouter un nouveau membre à la structure.

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


3 commentaires

C'est logique. Donc, après avoir pointé le nœud suivant, je signalerais également le précédent. Mais je ne serais-je pas obligé de faire un autre pointeur sur le nœud actuel afin que les pointeurs suivants et PREV peuvent se référencer au nœud actuel? Dernier nœud pointe également sur NULL, quel premier nœud signifierait-il s'il n'y a pas de nœud précédent? Cela dirait-il aussi à NULL? ou une boucle dos au dernier noeud peut-être?


Tout en créant lui-même, vous devez créer le lien vers le nœud précédent. Étant donné que vous ajoutez à la fin d'une liste, vous devez avoir le pointeur du dernier nœud avant l'insertion.


et le pointeur de tête précédent est comme le prochain pointeur du dernier nœud, null



0
votes

1) suggère fortement de changer: xxx

à: xxx

puis partout où dans le code qu'il relie à un nouveau noeud , Ajoutez la déclaration nécessaire pour définir le champ «antérieur». N'oubliez pas que le nœud FIRS contiendra NULL dans le champ «antérieur».


0 commentaires