//Programa C para mesclar uma lista vinculada em outro nas
//posições alternativas
#include <stdio.h>
#include <stdlib.h>
// Um nó da lista aninhada
struct Node{
int data;
struct Node *next;
};
/* Função para inserir um nó no início*/
void push(struct Node ** head_ref, int new_data){
struct Node* new_node =
(struct Node*) malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
/* Função de utilitário para imprimir uma lista ligada individualmente */
void printList(struct Node *head)
{
struct Node *temp = head;
while (temp != NULL)
{
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// Função principal que insere nós da lista vinculada q em p em
// posições alternativas. Como o chefe da primeira lista nunca muda
// e o cabeçalho da segunda lista pode mudar, precisamos de um único ponteiro
// para primeira lista e ponteiro duplo para a segunda lista.
void merge(struct Node *p, struct Node **q){
struct Node *p_curr = p, *q_curr = *q;
struct Node *p_next, *q_next;
// Embora existam posições disponíveis em p
while (p_curr != NULL && q_curr != NULL)
{
// Salve os ponteiros seguintes
p_next = p_curr->next;
q_next = q_curr->next;
//
q_curr->next = p_next; // Alterar o próximo ponteiro de q_curr
p_curr->next = q_curr; // Alterar o próximo ponteiro de p_curr
//Atualize as dicas atuais para a próxima iteração
p_curr = p_next;
q_curr = q_next;
}
*q = q_curr; //Atualize o ponteiro principal da segunda lista
}
//Programa de driver para testar funções acima
int main()
{
struct Node *p = NULL, *q = NULL;
push(&p, 3);
push(&p, 2);
push(&p, 1);
printf("Primeira lista vinculada:\n");
printList(p);
push(&q, 8);
push(&q, 7);
push(&q, 6);
push(&q, 5);
push(&q, 4);
printf("Segunda lista vinculada :\n");
printList(q);
merge(p, &q);
printf("\nPrimeira lista alterada modificada :\n\n");
printList(p);
printf("\nSegunda lista vinculada modificada :\n");
printList(q);
getchar();
return 0;
}
Nenhum comentário:
Postar um comentário