laialii

Lista encadeada struct

Mar 6th, 2016
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.34 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct reg {
  5.     int valor;
  6.     struct reg *prox;
  7. };
  8. typedef struct reg celula; //define o tipo da estrutura como "celula"
  9.  
  10. void imprime(celula *c){
  11.     //função que insere um elemento ao final da lista
  12.     while(c->prox != NULL){//c é o elemento que percorre a lista
  13.         printf("%d ", c->prox->valor);//o elemento que percorre a lista aponta para o valor do próximo elemento
  14.         c = c->prox;
  15.     }
  16.     printf("\n");
  17. }
  18.  
  19. void insere(celula *c, int num){
  20.     //função que varre a lista e imprime cada elemento
  21.     celula *nova;//criação de uma nova celula na estrutura
  22.     nova = (celula*)malloc(sizeof(celula));
  23.     nova->valor = num;
  24.     nova->prox = NULL;//cria um novo elemento vazio na lista
  25.  
  26.     while(c->prox != NULL){
  27.         c = c->prox;
  28.     }
  29.    
  30.     c->prox = nova;
  31. }
  32.  
  33. int busca(celula *c, int num) {
  34.     // função que insere num no final da lista e retorne
  35.     // o "indice virtual" (a partir do 0) ou -1 se nao encontrar
  36.     int cont=0;
  37.     while(c->prox != NULL){
  38.         if (num==c->valor){
  39.             return cont;
  40.         }
  41.         c = c->prox;
  42.         cont++;
  43.         printf("\nContador: ", cont);
  44.     }
  45.     while(c->prox != NULL){
  46.         printf("%d ", c->prox->valor);
  47.         c = c->prox;
  48.     }
  49. }
  50.  
  51. void apagar(celula *c, int num) {
  52.     // função que varre a lista em busca de num e remove a celula (desaloca),
  53.     // do elemento anterior ao removido reapontando o ponteiro prox
  54.     celula *ant = c; // elemento anterior
  55.     celula *p = c; // ponteiro que percorre a lista
  56.  
  57.     while(c->prox != NULL && p->valor!=num){
  58.         ant = p;
  59.         p = p->prox;
  60.     }  
  61.         if (ant!=NULL){//função que retira elemento
  62.             c = p->prox;
  63.             free(c);
  64.         }    
  65.  
  66.         else ant->prox = p->prox; //element é retirado do meio da lista
  67.     free(p);   
  68. }
  69.  
  70. void insere_indice(celula *c, int num, int indice){
  71. //função que insere um novo elemento com valor (valor) na posição ocupada pelo índice (indice)
  72.     celula *ant, *atual;
  73.     int contador = 0;
  74.     ant = c;//variavel ant aponta pra variavel anterior
  75.     atual = c->prox;
  76.    
  77.     while(ant->prox!= NULL){
  78.         if (contador==indice){
  79.             celula *nova;
  80.             nova = (celula*)malloc(sizeof(celula));
  81.             nova->valor = num;
  82.             nova->prox = atual->prox;
  83.         }
  84.         contador++;
  85.         ant = ant->prox;
  86.     }
  87.     while(c->prox != NULL){
  88.         printf("%d ", c->valor);
  89.         c = c->prox;
  90.     }
  91. }
  92.  
  93. int main(){
  94.     int opcao, num, ind;
  95.  
  96.     celula *cabeca;
  97.     cabeca = (celula*)malloc(sizeof(celula));
  98.     //malloc tem o tamanho de 1 celula
  99.     cabeca->prox = NULL;
  100.     //iniciando a lista sem nenhum elemento
  101.  
  102.     do{
  103.         printf("1. Imprime a lista;\n2. Insere elemento ao final da lista;\n3. Busca elemento na lista;\n4. Remove elemento da lista;\n5.Insere índice\n0. Encerra o programa.\n");
  104.         scanf("%d", &opcao);
  105.         if (opcao == 1) imprime (cabeca);
  106.         if (opcao == 2) {
  107.             printf("Informe um inteiro:\n");
  108.             scanf("%d", &num);
  109.             insere(cabeca, num);
  110.         }
  111.         if (opcao == 3) {
  112.             printf("Informe um inteiro para a busca:\n");
  113.             scanf("%d", &num);
  114.             busca(cabeca, num);
  115.         }
  116.         if (opcao == 4) {
  117.             printf("Informe um inteiro a ser removido:\n");
  118.             scanf("%d", &num);
  119.             apagar(cabeca, num);
  120.         }
  121.         if (opcao == 5) {
  122.             printf("Informe um valor:\n");
  123.             scanf("%d", &num);
  124.             printf("Informe um índice:\n");
  125.             scanf("%d", &ind);
  126.             insere_indice(cabeca,num,ind);
  127.         }
  128.     } while (opcao!=0);
  129.  
  130.     return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment