Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- /*
- /@autor: Shouldz
- /@Linguagem: C
- /@Descrição: [Estrutura de Dados] Lista Simplesmente Encadeada com inserir, remover, concatenar e merge funcionais.
- */
- typedef struct no{
- int valor;
- struct no *proximo;
- }no;
- no *criar_no(int valor){
- no *criar_no = malloc(sizeof(no));
- criar_no -> valor = valor;
- criar_no -> proximo = NULL;
- return criar_no;
- }
- no *concatenar(no *lista, no *lista2){
- no *auxiliar = lista;
- while(auxiliar -> proximo != NULL){
- auxiliar = auxiliar -> proximo;
- }
- auxiliar -> proximo = lista2;
- auxiliar = lista;
- return auxiliar;
- }
- no *inserir(no *lista, int valor){
- //caso base
- if(lista == NULL){
- return criar_no(valor);
- }else{
- //caso não nulo, inserir no final
- no *auxiliar = lista;
- while(auxiliar -> proximo != NULL){
- auxiliar = auxiliar -> proximo;
- }
- auxiliar -> proximo = criar_no(valor);
- }
- return lista;
- }
- no *Merge(no *lista, no *lista2){
- //Inicialização de variáveis de controle
- int contL1 = 0, contL2 = 0, contadorMain = 0;
- no *auxiliaR = lista, *auxiliaR2 = lista2, *merge = NULL;
- //While para verificar o tamanho das listas
- while(auxiliaR != NULL && auxiliaR2 != NULL){
- if(auxiliaR != NULL){
- contL1++;
- auxiliaR = auxiliaR -> proximo;
- }else{
- contL2++;
- auxiliaR2 = auxiliaR2 -> proximo;
- }
- }
- //Atualização dos ponteiros auxiliares
- auxiliaR = lista;
- auxiliaR2 = lista2;
- if(contL1 < contL2){
- contL1 = contL2;
- }
- //Realização do merge enquanto meu contador principal menor que a maior lista
- while(contadorMain < contL1){
- //Caso 01: Lista 1 ou 2 nula ou chegou a nula -> inserir o resto da lista não nula
- if(auxiliaR == NULL || auxiliaR2 == NULL){
- if(auxiliaR == NULL){
- merge = inserir(merge, auxiliaR2 -> valor);
- auxiliaR2 = auxiliaR2->proximo;
- }else {
- merge = inserir(merge, auxiliaR->valor);
- auxiliaR = auxiliaR->proximo;
- }
- //Case base: inserir reversando elemento das listas
- }else {
- merge = inserir(merge, auxiliaR->valor);
- merge = inserir(merge, auxiliaR2->valor);
- //Atualização da posição dentro da lista
- auxiliaR = auxiliaR->proximo;
- auxiliaR2 = auxiliaR2->proximo;
- }
- contadorMain++;
- }
- return merge;
- }
- no *remover(no *lista, int valor){
- //caso base
- no *auxiliar = lista;
- if(lista == NULL){
- return lista;
- //caso primeiro elemento
- }else if(auxiliar -> valor == valor){
- auxiliar = auxiliar -> proximo;
- return auxiliar;
- }else{
- //caso segundo elemento em diante
- while(auxiliar -> proximo != NULL){
- if(auxiliar -> proximo -> valor == valor){
- auxiliar -> proximo = auxiliar -> proximo -> proximo;
- return lista;
- }
- auxiliar = auxiliar -> proximo;
- }
- }
- }
- void imprimir(no *lista){
- no *auxiliar = lista;
- while(auxiliar != NULL){
- printf("[%d] ", auxiliar -> valor);
- auxiliar = auxiliar -> proximo;
- }
- printf("\n");
- }
- void main(){
- no *lista = NULL;
- lista = inserir(lista, 15);
- lista = inserir(lista, 30);
- lista = inserir(lista, 50);
- lista = inserir(lista, 65);
- lista = inserir(lista, 98);
- imprimir(lista);
- lista = remover(lista, 15);
- imprimir(lista);
- lista = remover(lista, 98);
- imprimir(lista);
- lista = remover(lista, 50);
- imprimir(lista);
- }
Advertisement
Add Comment
Please, Sign In to add comment