Advertisement
Guest User

tavares

a guest
Feb 2nd, 2009
711
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.73 KB | None | 0 0
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. struct lista{
  5.        int info;
  6.        struct lista* prox;
  7. };
  8. typedef struct lista Lista;
  9.  
  10. /* insere circular */
  11. Lista* insere_circular (Lista* l, int i){
  12.        Lista* novo = (Lista*)malloc(sizeof(Lista));
  13.        Lista* p = l;
  14.        novo->info = i;
  15.        if (l==NULL){
  16.           novo->prox=novo;
  17.           return novo;
  18.        }
  19.        for(;p->prox!=l;p=p->prox);
  20.        p->prox=novo;
  21.        novo->prox=l;
  22.        return novo;
  23. }
  24.  
  25. /* insere ordenando */
  26. Lista* insere_ordenado (Lista* l, int i){
  27.        Lista* novo = (Lista*)malloc(sizeof(Lista));
  28.        Lista* p = l;
  29.        Lista* ant = NULL;
  30.        Lista* t = p;
  31.        int cont = 0;
  32.        novo->info = i;
  33.        if (l==NULL){
  34.           novo->prox=novo;
  35.           return novo;
  36.        }
  37.        do {
  38.            p = p->prox;
  39.            cont++;
  40.        }while(p!=l);
  41.        while(cont>0 && p->info<i){
  42.                  ant = p;
  43.                  p=p->prox;
  44.                  cont--;
  45.        }
  46.        if (ant==NULL)
  47.           l=novo;
  48.        for(;t->prox!=p;t=t->prox);
  49.        t->prox=novo;
  50.        novo->prox=p;
  51.        return l;
  52. }
  53.        
  54. /* imprime */  
  55. void imprime_circular (Lista* l){
  56.        Lista* p = l;
  57.        printf ("\n");
  58.        do {
  59.            printf ("\neu=%p prox=%p sou=%d", p, p->prox, p->info);
  60.            p=p->prox;
  61.        }while(p!=l);
  62. }
  63.  
  64. /* busca dado */
  65. Lista* busca_circular(Lista* l, int v){
  66.        Lista* p = l;
  67.        do {
  68.            if (p->info == v)
  69.               return p;
  70.            p=p->prox;
  71.        }while(p!=l);
  72.        return NULL;
  73. }
  74.  
  75. /* retira dado */
  76. Lista* retira_circular(Lista* l, int v){
  77.        Lista* p = busca_circular(l,v);
  78.        Lista* t = p;
  79.        if (p==NULL){
  80.           printf("\nNao encontrado!");
  81.           return l;
  82.        }
  83.        if (p==l)
  84.           l=p->prox;
  85.        for (;t->prox!=p;t=t->prox);
  86.        t->prox=p->prox;
  87.        free(p);
  88.        return l;
  89. }
  90.  
  91. /* libera memória */
  92. void libera_circular(Lista* l){
  93.      Lista* p = l;
  94.      int i;
  95.      do {
  96.          p=p->prox;
  97.          i++;
  98.      }while(p!=l);
  99.      while (i){
  100.            Lista* t = p->prox;
  101.            free (p);
  102.            p = t;
  103.            i--;
  104.      }
  105. }      
  106.  
  107. /* teste simples */
  108. int main(){
  109.     Lista* l = NULL;
  110.     l = insere_ordenado (l,78);
  111.     l = insere_ordenado (l,2);
  112.     l = insere_ordenado (l,20);
  113.     l = insere_ordenado (l,4);
  114.     l = insere_ordenado (l,30);
  115.     l = insere_ordenado (l,6);
  116.     printf("--> Lista encadeada circular com ordenacao:");
  117.     imprime_circular(l);
  118.     printf("\n\n");
  119.     l = retira_circular (l, 20);
  120.     printf("--> Lista despois de retirar elemento 20:");
  121.     imprime_circular(l);
  122.     getch();
  123. }
  124.        
  125.        
  126.  
  127.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement