#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* Estrutura que armazenara um simbolo */
typedef struct symbol {
int id;
char * symname;
struct symbol * vence1;
struct symbol * vence2;
} tipoSymbol;
/* Funcao que cria uma lista circular duplamente encadeada vazia (noh cabeca) */
tipoSymbol * inicializar_lst( ) {
tipoSymbol * lst;
lst
= ( tipoSymbol
* ) malloc ( sizeof ( tipoSymbol
) ) ;
lst-> vence1 = lst;
lst-> vence2 = lst;
return lst;
}
/* Percorre a lista (travessia), imprimindo seus elementos */
void imprimir( tipoSymbol * lst) {
tipoSymbol * p = lst;
int sentinela = lst-> id;
do {
printf ( "%-3d %-10s" , p
-> id
, p
-> symname
) ; printf ( "Ganha de: %-8s e %s \n " , p
-> vence1
-> symname
, p
-> vence2
-> symname
) ; p = p-> vence1;
} while ( p-> id != sentinela && p != NULL) ;
}
/* Funcao que insere noh em uma lista circular duplamente encadeada */
void inserir( tipoSymbol * lst, int sid, char * sname) {
tipoSymbol * novo_noh; /* Ponteiro para novo noh */
novo_noh
= ( tipoSymbol
* ) malloc ( sizeof ( tipoSymbol
) ) ; /* Aloca espaco para novo noh */
novo_noh-> id = sid; /* Armazena id do novo simbolo */
novo_noh-> symname = sname; /* Armazena nome do novo simbolo */
novo_noh-> vence2 = lst;
novo_noh-> vence1 = lst-> vence1;
lst-> vence1-> vence2 = novo_noh;
lst-> vence1 = novo_noh;
}
/* Funcao que retira um item da lista duplamente encadeada */
void remover( tipoSymbol * lst) {
/* Verifica se eh o PRIMEIRO item da lista */
if ( lst-> vence2 != NULL)
lst-> vence2-> vence1 = lst-> vence1;
/* Verifica se eh o ULTIMO item da lista */
if ( lst-> vence1 != NULL)
lst-> vence1-> vence2 = lst-> vence2;
}
/* Funcao para liberar espaco alocado via malloc
* para cada um dos elementos de uma lista encadeada */
void liberar( tipoSymbol* lst) {
tipoSymbol * f; /* Ponteiro auxiliar */
/* Faz a travessia da lista ateh encontrar o ultimo item. */
while ( lst != NULL) {
f = lst;
lst = lst-> vence1;
}
}
/* Funcao principal */
int main( ) {
int i, j;
/* Criar uma lista vazia */
tipoSymbol * lista, * p;
/* Noh cabeca */
lista
= ( tipoSymbol
* ) malloc ( sizeof ( tipoSymbol
) ) ; lista-> id = 4 ;
lista-> symname = "lagarto" ;
lista-> vence1 = lista;
lista-> vence2 = lista;
/* Insercao dos demais itens,
de forma circular e duplamente encadeada */
inserir( lista, 0 , "pedra" ) ;
inserir( lista, 1 , "papel" ) ;
inserir( lista, 2 , "tesoura" ) ;
inserir( lista, 3 , "spock" ) ;
/* Lista preliminar.
Apenas campo 'vence1' estah correto. */
printf ( "-------------------------\n " ) ; printf ( "Lista PRELIMINAR \n " ) ; printf ( "-------------------------\n " ) ; imprimir( lista) ;
/* Lista nao-linear */
p = lista;
for ( i= 0 ; i< 5 ; i++ ) {
p-> vence2 = p-> vence1-> vence1-> vence1;
p = p-> vence1;
}
/* Lista definitiva. */
printf ( "-------------------------\n " ) ; printf ( "Lista DEFINITIVA \n " ) ; printf ( "-------------------------\n " ) ; imprimir( lista) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKCi8qIEVzdHJ1dHVyYSBxdWUgYXJtYXplbmFyYSB1bSBzaW1ib2xvICovCnR5cGVkZWYgc3RydWN0IHN5bWJvbCB7CglpbnQgCQkJaWQ7CgljaGFyCQkJKnN5bW5hbWU7CglzdHJ1Y3Qgc3ltYm9sIAkqdmVuY2UxOwoJc3RydWN0IHN5bWJvbCAJKnZlbmNlMjsKfSB0aXBvU3ltYm9sOwoKCi8qIEZ1bmNhbyBxdWUgY3JpYSB1bWEgbGlzdGEgY2lyY3VsYXIgZHVwbGFtZW50ZSBlbmNhZGVhZGEgdmF6aWEgKG5vaCBjYWJlY2EpICovCnRpcG9TeW1ib2wgKmluaWNpYWxpemFyX2xzdCgpIHsKICAgIHRpcG9TeW1ib2wgKmxzdDsKICAgIGxzdCA9ICh0aXBvU3ltYm9sKikgbWFsbG9jKHNpemVvZih0aXBvU3ltYm9sKSk7CgogICAgbHN0LT52ZW5jZTEgPSBsc3Q7CiAgICBsc3QtPnZlbmNlMiA9IGxzdDsKCiAgICByZXR1cm4gbHN0Owp9CgoKLyogUGVyY29ycmUgYSBsaXN0YSAodHJhdmVzc2lhKSwgaW1wcmltaW5kbyBzZXVzIGVsZW1lbnRvcyAqLwp2b2lkIGltcHJpbWlyKHRpcG9TeW1ib2wgKmxzdCkgewogICAgdGlwb1N5bWJvbCAqcCA9IGxzdDsKICAgIGludCBzZW50aW5lbGEgPSBsc3QtPmlkOwoKICAgIGRvIHsKICAgICAgIHByaW50ZigiJS0zZCAlLTEwcyIsIHAtPmlkLCBwLT5zeW1uYW1lKTsKICAgICAgIHByaW50ZigiR2FuaGEgZGU6ICUtOHMgZSAlcyBcbiIsIHAtPnZlbmNlMS0+c3ltbmFtZSwgcC0+dmVuY2UyLT5zeW1uYW1lKTsKICAgICAgIHAgPSBwLT52ZW5jZTE7CiAgICB9IHdoaWxlIChwLT5pZCAhPSBzZW50aW5lbGEgJiYgcCAhPSBOVUxMKTsKCiAgICBwcmludGYoIlxuIik7Cn0KCgovKiBGdW5jYW8gcXVlIGluc2VyZSBub2ggZW0gdW1hIGxpc3RhIGNpcmN1bGFyIGR1cGxhbWVudGUgZW5jYWRlYWRhICovCnZvaWQgaW5zZXJpcih0aXBvU3ltYm9sICpsc3QsIGludCBzaWQsIGNoYXIgKnNuYW1lKSB7CiAgICB0aXBvU3ltYm9sICpub3ZvX25vaDsgICAgICAgLyogUG9udGVpcm8gcGFyYSBub3ZvIG5vaCAqLwogICAgbm92b19ub2ggPSAodGlwb1N5bWJvbCopIG1hbGxvYyhzaXplb2YodGlwb1N5bWJvbCkpOyAgIC8qIEFsb2NhIGVzcGFjbyBwYXJhIG5vdm8gbm9oICovCgogICAgbm92b19ub2gtPmlkID0gc2lkOyAgICAgICAgICAgICAvKiBBcm1hemVuYSBpZCBkbyBub3ZvIHNpbWJvbG8gKi8KICAgIG5vdm9fbm9oLT5zeW1uYW1lID0gc25hbWU7ICAgICAgLyogQXJtYXplbmEgbm9tZSBkbyBub3ZvIHNpbWJvbG8gKi8KCiAgICBub3ZvX25vaC0+dmVuY2UyID0gbHN0OwogICAgbm92b19ub2gtPnZlbmNlMSA9IGxzdC0+dmVuY2UxOwoKICAgIGxzdC0+dmVuY2UxLT52ZW5jZTIgPSBub3ZvX25vaDsKICAgIGxzdC0+dmVuY2UxID0gbm92b19ub2g7Cn0KCgovKiBGdW5jYW8gcXVlIHJldGlyYSB1bSBpdGVtIGRhIGxpc3RhIGR1cGxhbWVudGUgZW5jYWRlYWRhICovCnZvaWQgcmVtb3Zlcih0aXBvU3ltYm9sICpsc3QpIHsKICAgIC8qIFZlcmlmaWNhIHNlIGVoIG8gUFJJTUVJUk8gaXRlbSBkYSBsaXN0YSAqLwogICAgaWYgKGxzdC0+dmVuY2UyICE9IE5VTEwpCiAgICAgICAgbHN0LT52ZW5jZTItPnZlbmNlMSA9IGxzdC0+dmVuY2UxOwoKICAgIC8qIFZlcmlmaWNhIHNlIGVoIG8gVUxUSU1PIGl0ZW0gZGEgbGlzdGEgKi8KICAgIGlmIChsc3QtPnZlbmNlMSAhPSBOVUxMKQogICAgICAgIGxzdC0+dmVuY2UxLT52ZW5jZTIgPSBsc3QtPnZlbmNlMjsKCiAgICBmcmVlKGxzdCk7Cn0KCi8qIEZ1bmNhbyBwYXJhIGxpYmVyYXIgZXNwYWNvIGFsb2NhZG8gdmlhIG1hbGxvYwogKiBwYXJhIGNhZGEgdW0gZG9zIGVsZW1lbnRvcyBkZSB1bWEgbGlzdGEgZW5jYWRlYWRhICovCnZvaWQgbGliZXJhcih0aXBvU3ltYm9sKiBsc3QpIHsKICAgIHRpcG9TeW1ib2wgKmY7ICAgICAgICAgLyogUG9udGVpcm8gYXV4aWxpYXIgKi8KCiAgICAvKiBGYXogYSB0cmF2ZXNzaWEgZGEgbGlzdGEgYXRlaCBlbmNvbnRyYXIgbyB1bHRpbW8gaXRlbS4gKi8KICAgIHdoaWxlIChsc3QgIT0gTlVMTCkgewogICAgICAgIGYgICA9IGxzdDsKICAgICAgICBsc3QgPSBsc3QtPnZlbmNlMTsKICAgICAgICBmcmVlKGYpOwogICAgfQp9CgoKLyogRnVuY2FvIHByaW5jaXBhbCAqLwppbnQgbWFpbigpIHsKICAgIGludCBpLCBqOwoKICAgIC8qIENyaWFyIHVtYSBsaXN0YSB2YXppYSAqLwogICAgdGlwb1N5bWJvbCAqbGlzdGEsICpwOwoKICAgIC8qIE5vaCBjYWJlY2EgKi8KICAgIGxpc3RhID0gKHRpcG9TeW1ib2wqKSBtYWxsb2Moc2l6ZW9mKHRpcG9TeW1ib2wpKTsKICAgIGxpc3RhLT5pZCAgICAgICA9IDQ7CiAgICBsaXN0YS0+c3ltbmFtZSAgPSAibGFnYXJ0byI7CiAgICBsaXN0YS0+dmVuY2UxICAgPSBsaXN0YTsKICAgIGxpc3RhLT52ZW5jZTIgICA9IGxpc3RhOwoKICAgIC8qIEluc2VyY2FvIGRvcyBkZW1haXMgaXRlbnMsCiAgICAgICBkZSBmb3JtYSBjaXJjdWxhciBlIGR1cGxhbWVudGUgZW5jYWRlYWRhICovCiAgICBpbnNlcmlyKGxpc3RhLCAwLCAicGVkcmEiKTsKICAgIGluc2VyaXIobGlzdGEsIDEsICJwYXBlbCIpOwogICAgaW5zZXJpcihsaXN0YSwgMiwgInRlc291cmEiKTsKICAgIGluc2VyaXIobGlzdGEsIDMsICJzcG9jayIpOwoKICAgIC8qIExpc3RhIHByZWxpbWluYXIuCiAgICAgICBBcGVuYXMgY2FtcG8gJ3ZlbmNlMScgZXN0YWggY29ycmV0by4gKi8KICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICBwcmludGYoIkxpc3RhIFBSRUxJTUlOQVIgXG4iKTsKICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICBpbXByaW1pcihsaXN0YSk7CiAgICBwcmludGYoIlxuXG4iKTsKCiAgICAvKiBMaXN0YSBuYW8tbGluZWFyICovCiAgICBwID0gbGlzdGE7CiAgICBmb3IgKGk9MDsgaTw1OyBpKyspIHsKICAgICAgICBwLT52ZW5jZTIgPSBwLT52ZW5jZTEtPnZlbmNlMS0+dmVuY2UxOwogICAgICAgIHAgPSBwLT52ZW5jZTE7CiAgICB9CgogICAgLyogTGlzdGEgZGVmaW5pdGl2YS4gKi8KICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICBwcmludGYoIkxpc3RhIERFRklOSVRJVkEgXG4iKTsKICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICBpbXByaW1pcihsaXN0YSk7CgogICAgcmV0dXJuIDA7Cn0=