Programa controlado por menú para todas las operaciones en una lista doblemente enlazada en C

Una lista enlazada es una estructura de datos lineal que consta de dos partes: una es la parte de datos y la otra es la parte de dirección. Una lista doblemente enlazada contiene tres partes: una es la parte de datos y las otras dos son la dirección del Node siguiente y anterior en la lista. En este artículo, todas las operaciones comunes de una lista doblemente enlazada se analizan en un programa controlado por menú .

Operaciones a realizar :

  • atravesar(): Para ver el contenido de la lista enlazada, es necesario recorrer la lista doblemente enlazada dada. La función traverse() dada atraviesa e imprime el contenido de la lista doblemente enlazada.
  • insertAtFront(): esta función simplemente inserta un elemento al principio o al principio de la lista doblemente enlazada.
  • insertAtEnd(): Esta función inserta un elemento al final de la lista doblemente enlazada.
  • insertAtPosition(): Esta función inserta un elemento en una posición específica en la lista doblemente enlazada.
  • deleteFirst(): esta función simplemente elimina un elemento del frente/comienzo de la lista doblemente enlazada.
  • deleteEnd(): esta función simplemente elimina un elemento del final de la lista doblemente enlazada.
  • deletePosition(): esta función elimina un elemento de una posición específica en la lista doblemente enlazada.

A continuación se muestra la implementación de las operaciones anteriores:

C

// C program for the all operations in
// the Doubly Linked List
#include <stdio.h>
#include <stdlib.h>
 
// Linked List Node
struct node {
    int info;
    struct node *prev, *next;
};
struct node* start = NULL;
 
// Function to traverse the linked list
void traverse()
{
    // List is empty
    if (start == NULL) {
        printf("\nList is empty\n");
        return;
    }
    // Else print the Data
    struct node* temp;
    temp = start;
    while (temp != NULL) {
        printf("Data = %d\n", temp->info);
        temp = temp->next;
    }
}
 
// Function to insert at the front
// of the linked list
void insertAtFront()
{
    int data;
    struct node* temp;
    temp = (struct node*)malloc(sizeof(struct node));
    printf("\nEnter number to be inserted: ");
    scanf("%d", &data);
    temp->info = data;
    temp->prev = NULL;
 
    // Pointer of temp will be
    // assigned to start
    temp->next = start;
    start = temp;
}
 
// Function to insert at the end of
// the linked list
void insertAtEnd()
{
    int data;
    struct node *temp, *trav;
    temp = (struct node*)malloc(sizeof(struct node));
    temp->prev = NULL;
    temp->next = NULL;
    printf("\nEnter number to be inserted: ");
    scanf("%d", &data);
    temp->info = data;
    temp->next = NULL;
    trav = start;
 
    // If start is NULL
    if (start == NULL) {
 
        start = temp;
    }
 
    // Changes Links
    else {
        while (trav->next != NULL)
            trav = trav->next;
        temp->prev = trav;
        trav->next = temp;
    }
}
 
// Function to insert at any specified
// position in the linked list
void insertAtPosition()
{
    int data, pos, i = 1;
    struct node *temp, *newnode;
    newnode = malloc(sizeof(struct node));
    newnode->next = NULL;
    newnode->prev = NULL;
 
    // Enter the position and data
    printf("\nEnter position : ");
    scanf("%d", &pos);
     
 
    // If start==NULL,
    if (start == NULL) {
        start = newnode;
        newnode->prev = NULL;
        newnode->next = NULL;
    }
 
    // If position==1,
    else if (pos == 1) {
      // this is author method its correct but we can simply call insertAtfront() function for this special case
       /* newnode->next = start;
        newnode->next->prev = newnode;
        newnode->prev = NULL;
        start = newnode; */
      // now this is improved by Jay Ghughriwala on geeksforgeeks
      insertAtFront();
    }
 
    // Change links
    else {
      printf("\nEnter number to be inserted: ");
    scanf("%d", &data);
    newnode->info = data;
    temp = start;
        while (i < pos - 1) {
            temp = temp->next;
            i++;
        }
        newnode->next = temp->next;
        newnode->prev = temp;
        temp->next = newnode;
        temp->next->prev = newnode;
    }
}
 
// Function to delete from the front
// of the linked list
void deleteFirst()
{
    struct node* temp;
    if (start == NULL)
        printf("\nList is empty\n");
    else {
        temp = start;
        start = start->next;
        if (start != NULL)
            start->prev = NULL;
        free(temp);
    }
}
 
// Function to delete from the end
// of the linked list
void deleteEnd()
{
    struct node* temp;
    if (start == NULL)
        printf("\nList is empty\n");
    temp = start;
    while (temp->next != NULL)
        temp = temp->next;
    if (start->next == NULL)
        start = NULL;
    else {
        temp->prev->next = NULL;
        free(temp);
    }
}
 
// Function to delete from any specified
// position from the linked list
void deletePosition()
{
    int pos, i = 1;
    struct node *temp, *position;
    temp = start;
 
    // If DLL is empty
    if (start == NULL)
        printf("\nList is empty\n");
 
    // Otherwise
    else {
        // Position to be deleted
        printf("\nEnter position : ");
        scanf("%d", &pos);
 
        // If the position is the first node
        if (pos == 1) {
            deleteFirst(); // im,proved by Jay Ghughriwala on GeeksforGeeks
            if (start != NULL) {
                start->prev = NULL;
            }
            free(position);
            return;
        }
 
        // Traverse till position
        while (i < pos - 1) {
            temp = temp->next;
            i++;
        }
        // Change Links
        position = temp->next;
        if (position->next != NULL)
            position->next->prev = temp;
        temp->next = position->next;
 
        // Free memory
        free(position);
    }
}
 
// Driver Code
int main()
{
    int choice;
    while (1) {
 
        printf("\n\t1  To see list\n");
        printf("\t2  For insertion at"
               " starting\n");
        printf("\t3  For insertion at"
               " end\n");
        printf("\t4  For insertion at "
               "any position\n");
        printf("\t5  For deletion of "
               "first element\n");
        printf("\t6  For deletion of "
               "last element\n");
        printf("\t7  For deletion of "
               "element at any position\n");
        printf("\t8 To exit\n");
        printf("\nEnter Choice :\n");
        scanf("%d", &choice);
 
        switch (choice) {
        case 1:
            traverse();
            break;
        case 2:
            insertAtFront();
            break;
        case 3:
            insertAtEnd();
            break;
        case 4:
            insertAtPosition();
            break;
        case 5:
            deleteFirst();
            break;
        case 6:
            deleteEnd();
            break;
        case 7:
            deletePosition();
            break;
 
        case 8:
            exit(1);
            break;
        default:
            printf("Incorrect Choice. Try Again \n");
            continue;
        }
    }
    return 0;
}

Producción:

Menú:

Inserción al inicio:

Inserción al final:

Inserción en posición específica:

Imprima la Lista Vinculada:

Elimine el primer y último elemento con la opción 5 y 6:

Publicación traducida automáticamente

Artículo escrito por imsushant12 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *