es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Insertando elementos en una lista enlazada en varios índices utilizando una sola función.

Este es el código que intenté escribir para agregar un elemento en una lista doblemente enlazada, que toma un índice y un valor y agrega un nuevo elemento a la lista original. Sin embargo, está tomando el índice y el valor, pero solo agrega los elementos que doy como una pila.

Sin embargo, este código (para una lista doblemente enlazada) solo agrega elementos uno tras otro, sin tener en cuenta el índice pasado. Mi profesor nos dio un código para una lista simplemente enlazada donde hizo algo similar. ¿Cómo puedo abordar este problema?

“`C++
node *add(node *head, int index, int val)
{
node *new = create(val);
node *temp = malloc(sizeof(node));
if (head == NULL)
{
head = new;
temp = head;
//printf(": %d",temp->data);
}
temp = head;
int i = 1;
while (i < (index – 1) && (temp->next != NULL))
{
i++;
temp = temp->next;
}
temp->next = new;
new->next = NULL;
new->prev = temp;
return head;
}

struct Node <em>insert(struct Node *listp, int pos, int info)
{
/</em>Inserts a Node in list at position pos with data info
pos>0. If pos>list length then new node added at end.
If pos<1 adds at beginning.
*/
struct Node *new=malloc(sizeof(struct Node)), *prev;// new is the new node we create everytime.
//create new node and initialize fields
new->data=info;
new->next=NULL;
if (listp==NULL) listp=new;
else
if (pos<=1) { //negative or 1 index.
new->next=listp; //first node bann gaya new
listp=new; //head is pointing at new
}
else {
//pos>1. Go to node at pos-1.
prev=listp;
int i=1;
while ((i++<pos-1) &&="" prev-="">next!=NULL) { //indexing
prev=prev->next;
}
new->next=prev->next;
prev->next=new;
}
return listp;
}
“`</pos-1)>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar un elemento en una lista doblemente enlazada en un índice específico, es necesario modificar la función “add”. Aquí se muestra una versión modificada de la función “add” que debería funcionar según lo previsto:

    node *add(node *head, int index, int val)
    {
        node *new = create(val);
        if (head == NULL) {
            return new;
        }
        if (index <= 1) {
            new->next = head;
            head->prev = new;
            return new;
        }
        node *temp = head;
        int i = 1;
        while (i < (index - 1) && (temp->next != NULL)) {
            i++;
            temp = temp->next;
        }
        if (temp->next != NULL) {
            temp->next->prev = new;
            new->next = temp->next;
        }
        new->prev = temp;
        temp->next = new;
        return head;
    }
    

    Así es como funciona:

    1. Creamos un nuevo nodo con el valor dado.
    2. Si el “head” es NULL, simplemente devolvemos el nuevo nodo.
    3. Si el índice es 1 o inferior, insertamos el nuevo nodo al principio de la lista.
    4. De lo contrario, recorremos la lista para encontrar el nodo en el índice anterior.
    5. Si el nodo en el índice anterior tiene un nodo siguiente, actualizamos su puntero “prev” para que apunte al nuevo nodo.
    6. Actualizamos los punteros “next” y “prev” del nuevo nodo y del nodo anterior para insertar el nuevo nodo en la lista.
    7. Devolvemos el nodo “head”.

    Tenga en cuenta que la función “create” no se muestra aquí, pero debería devolver un nuevo nodo con el valor dado y punteros “next” y “prev” NULOS.

Comments are closed.