#include <stdio.h>
#include <stdlib.h>
/* Questão 2
Crie um TAD Lista (genérica), com as funções a seguir.
criarLista() Cria a lista vazia, alocando a memória necessária.
inserir(lista, elem) Insere um elemento ao final da lista.
inserirPos(lista, pos, elem) Insere um elemento na posição informada.
remover(lista, pos) Remove o elemento da posição informada (lembre-se de liberar a memória).
obter(lista, pos) Retorna o elemento localizado na posição informada.
tamanho(lista) Retorna a quantidade de elementos da lista.
destruirLista(lista) Destrói toda a lista (lembre-se de liberar a memória).
*/
/* Minhas estruturas */
typedef struct lista
{
struct no * prim;
struct no * ult;
int tam;
} lista;
typedef struct no
{
struct no * prox;
void * elem;
} no;
typedef struct pessoa
{
char nome;
int idade;
} pessoa;
/* minhas funções */
lista * criaLista( )
{
lista
* lst
= malloc ( sizeof ( lista
) ) ; lst -> prim = NULL;
lst -> ult = NULL;
lst -> tam = 0 ;
return lst;
}
no * criaNo( void * n)
{
no -> prox = NULL;
no -> valor = n;
return no;
}
pessoa * criaPessoa( char nome, int idade)
{
pessoa
* pessoa
= malloc ( sizeof ( pessoa
) ) ;
pessoa -> nome = nome;
pessoa -> idade = idade;
return pessoa;
}
/* falta essa daqui */
lista * inserir( lista * lst, void )
{
no * novoNo = criaNo( val) ;
if ( lst -> prim == NULL)
lst -> prim = novoNo;
else
lst -> ult -> prox = novoNo;
lst -> ult = novoNo;
lst -> tam++;
return lst;
}
/* falta essa daqui */
lista * inserirPos( lista * lst, int pos, int val)
{
no * novoNo = criaNo( val) ;
no * noAux;
int cont = 1 ;
if ( pos == 0 )
{
novoNo -> prox = lst -> prim;
lst -> prim = novoNo;
}
else if ( ( pos > 0 ) && ( pos <= lst -> tam - 1 ) )
{
noAux = lst -> prim;
while ( cont < pos)
{
noAux = noAux -> prox;
cont++;
}
novoNo -> prox = noAux -> prox;
noAux -> prox = novoNo;
}
else
{
lst -> ult -> prox = novoNo;
lst -> ult = novoNo;
}
lst -> tam++;
return lst;
}
/* falta essa daqui */
lista * remover( lista * lst, int pos)
{
no * auxNo, * auxRem;
int cont;
if ( pos == 0 )
{
auxNo = lst -> prim -> prox;
lst -> prim = auxNo;
}
else if ( ( pos > 0 ) && ( pos < lst -> tam) )
{
auxNo = lst -> prim;
cont = 1 ;
while ( cont < pos)
{
auxNo = auxNo -> prox;
cont++;
}
auxRem = auxNo -> prox;
auxNo -> prox = auxNo -> prox -> prox;
}
else
{
auxNo = lst -> prim;
cont = 1 ;
while ( cont < pos)
{
auxNo = auxNo -> prox;
cont++;
}
lst -> ult = auxNo;
}
lst -> tam--;
return lst;
}
/* falta essa daqui */
int obter( lista * lst, int pos)
{
int i = 0 ;
no * noAux = lst -> prim;
if ( pos == 0 )
{
return lst -> prim -> valor;
}
else if ( ( pos > 0 ) && ( pos < lst-> tam - 1 ) )
{
while ( i < pos)
{
noAux = noAux -> prox;
i++;
}
return noAux -> valor;
}
else
{
return lst -> ult -> valor;
}
}
int tamanho( lista * lst)
{
return lst -> tam;
}
void destruirLista( lista * lst)
{
no * auxNo;
while ( lst -> prim != NULL)
{
auxNo = lst -> prim;
lst -> prim = auxNo -> prox;
}
}
int main( )
{
/* criando pessoas */
pessoa * p1 = criaPessoa( "anne" , 24 ) ;
pessoa * p2 = criaPessoa( "joão" , 21 ) ;
pessoa * p2 = criaPessoa( "maria" , 20 ) ;
/* testa função criarLista */
lista * lst = criaLista( ) ;
/* testa função inserir */
inserir( lst, p1) ;
inserir( lst, p2) ;
/* testa função inserirPos */
inserirPos( lst, 2 , p3) ;
/* testa função imprimir */
imprimir( lst) ;
/* testa função tamanho */
printf ( "Teste da função tamanho(): %d\n " , tamanho
( lst
) ) ;
/* testa função obter */
printf ( "Teste da função obter(): %d\n " , obter
( lst
, 2 ) ) ;
/* testa função remover
remover(lst, 0);
imprimir(lst);*/
/* testa função destruirLista
destruirLista(lst);*/
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCi8qIFF1ZXN0w6NvIDIKCkNyaWUgdW0gVEFEIExpc3RhIChnZW7DqXJpY2EpLCBjb20gYXMgZnVuw6fDtWVzIGEgc2VndWlyLgoKY3JpYXJMaXN0YSgpIENyaWEgYSBsaXN0YSB2YXppYSwgYWxvY2FuZG8gYSBtZW3Ds3JpYSBuZWNlc3PDoXJpYS4KaW5zZXJpcihsaXN0YSwgZWxlbSkgSW5zZXJlIHVtIGVsZW1lbnRvIGFvIGZpbmFsIGRhIGxpc3RhLgppbnNlcmlyUG9zKGxpc3RhLCBwb3MsIGVsZW0pIEluc2VyZSB1bSBlbGVtZW50byBuYSBwb3Npw6fDo28gaW5mb3JtYWRhLgpyZW1vdmVyKGxpc3RhLCBwb3MpIFJlbW92ZSBvIGVsZW1lbnRvIGRhIHBvc2nDp8OjbyBpbmZvcm1hZGEgKGxlbWJyZS1zZSBkZSBsaWJlcmFyIGEgbWVtw7NyaWEpLgpvYnRlcihsaXN0YSwgcG9zKSBSZXRvcm5hIG8gZWxlbWVudG8gbG9jYWxpemFkbyBuYSBwb3Npw6fDo28gaW5mb3JtYWRhLgp0YW1hbmhvKGxpc3RhKSBSZXRvcm5hIGEgcXVhbnRpZGFkZSBkZSBlbGVtZW50b3MgZGEgbGlzdGEuCmRlc3RydWlyTGlzdGEobGlzdGEpIERlc3Ryw7NpIHRvZGEgYSBsaXN0YSAobGVtYnJlLXNlIGRlIGxpYmVyYXIgYSBtZW3Ds3JpYSkuCgoqLwoKCgovKiBNaW5oYXMgZXN0cnV0dXJhcyAqLwp0eXBlZGVmIHN0cnVjdCBsaXN0YSAKewoJc3RydWN0IG5vICpwcmltOwoJc3RydWN0IG5vICp1bHQ7CglpbnQgdGFtOwp9bGlzdGE7CgoKdHlwZWRlZiBzdHJ1Y3Qgbm8KewoJc3RydWN0IG5vICpwcm94OwoJdm9pZCAqZWxlbTsKfW5vOwoKdHlwZWRlZiBzdHJ1Y3QgcGVzc29hCnsKCWNoYXIgbm9tZTsKCWludCBpZGFkZTsKfXBlc3NvYTsKCgovKiBtaW5oYXMgZnVuw6fDtWVzICovCmxpc3RhICpjcmlhTGlzdGEoKQp7CglsaXN0YSAqbHN0ID0gbWFsbG9jKHNpemVvZihsaXN0YSkpOwoJbHN0IC0+IHByaW0gPSBOVUxMOwoJbHN0IC0+IHVsdCA9IE5VTEw7Cglsc3QgLT4gdGFtID0gMDsKCXJldHVybiBsc3Q7Cn0KCgpubyAqY3JpYU5vKHZvaWQgKm4pCnsKCW5vICpubyA9IG1hbGxvYyhzaXplb2Yobm8pKTsKCW5vIC0+IHByb3ggPSBOVUxMOwoJbm8gLT4gdmFsb3IgPSBuOwoJcmV0dXJuIG5vOwp9CgoKcGVzc29hICpjcmlhUGVzc29hKGNoYXIgbm9tZSwgaW50IGlkYWRlKQp7CglwZXNzb2EgKnBlc3NvYSA9IG1hbGxvYyhzaXplb2YocGVzc29hKSk7CgkKCXBlc3NvYSAtPiBub21lID0gbm9tZTsKCXBlc3NvYSAtPiBpZGFkZSA9IGlkYWRlOwoJCglyZXR1cm4gcGVzc29hOwp9CgovKiBmYWx0YSBlc3NhIGRhcXVpICovCmxpc3RhICppbnNlcmlyKGxpc3RhICpsc3QsIHZvaWQgKQp7CglubyAqbm92b05vID0gY3JpYU5vKHZhbCk7CgkKCWlmIChsc3QgLT4gcHJpbSA9PSBOVUxMKQoJCWxzdCAtPiBwcmltID0gbm92b05vOwoJZWxzZQoJCWxzdCAtPiB1bHQgLT4gcHJveCA9IG5vdm9ObzsKCglsc3QgLT4gdWx0ID0gbm92b05vOwoJbHN0IC0+IHRhbSsrOwkKCXJldHVybiBsc3Q7Cn0KCi8qIGZhbHRhIGVzc2EgZGFxdWkgKi8KbGlzdGEgKmluc2VyaXJQb3MobGlzdGEgKmxzdCwgaW50IHBvcywgaW50IHZhbCkgCnsKCW5vICpub3ZvTm8gPSBjcmlhTm8odmFsKTsKCW5vICpub0F1eDsKCWludCBjb250ID0gMTsKCQoJaWYgKHBvcyA9PSAwKQoJewoJCW5vdm9ObyAtPiBwcm94ID0gbHN0IC0+IHByaW07CgkJbHN0IC0+IHByaW0gPSBub3ZvTm87Cgl9CQoJCgllbHNlIGlmICgocG9zID4gMCkgJiYgKHBvcyA8PSBsc3QgLT4gdGFtIC0gMSkpCgl7CgkJbm9BdXggPSBsc3QgLT4gcHJpbTsKCQl3aGlsZSAoY29udCA8IHBvcykKCQl7CgkJCW5vQXV4ID0gbm9BdXggLT4gcHJveDsKCQkJY29udCsrOwoJCX0KCQlub3ZvTm8gLT4gcHJveCA9IG5vQXV4IC0+IHByb3g7CgkJbm9BdXggLT4gcHJveCA9IG5vdm9ObzsKCX0KCQoJZWxzZQoJewoJCWxzdCAtPiB1bHQgLT4gcHJveCA9IG5vdm9ObzsKCQlsc3QgLT4gdWx0ID0gbm92b05vOwoJfQoKCWxzdCAtPiB0YW0rKzsKCXJldHVybiBsc3Q7Cn0KCi8qIGZhbHRhIGVzc2EgZGFxdWkgKi8KbGlzdGEgKnJlbW92ZXIobGlzdGEgKmxzdCwgaW50IHBvcykgCnsKCW5vICphdXhObywgKmF1eFJlbTsKCWludCBjb250OwoJCglpZiAocG9zID09IDApCgl7CgkJYXV4Tm8gPSBsc3QgLT4gcHJpbSAtPiBwcm94OwoJCWZyZWUobHN0IC0+IHByaW0pOwoJCWxzdCAtPiBwcmltID0gYXV4Tm87Cgl9CgllbHNlIGlmICgocG9zID4gMCkgJiYgKHBvcyA8IGxzdCAtPiB0YW0pKQoJewoJCQoJCWF1eE5vID0gbHN0IC0+IHByaW07CgkJY29udCA9IDE7CgkJd2hpbGUgKGNvbnQgPCBwb3MpCgkJewoJCQlhdXhObyA9IGF1eE5vIC0+IHByb3g7CgkJCWNvbnQrKzsKCQl9CgkJYXV4UmVtID0gYXV4Tm8gLT4gcHJveDsKCQlhdXhObyAtPiBwcm94ID0gYXV4Tm8gLT4gcHJveCAtPiBwcm94OwoJCWZyZWUoYXV4UmVtKTsKCQkKCX0KCWVsc2UKCXsKCQlhdXhObyA9IGxzdCAtPiBwcmltOwoJCWNvbnQgPSAxOwoJCXdoaWxlIChjb250IDwgcG9zKQoJCXsKCQkJYXV4Tm8gPSBhdXhObyAtPiBwcm94OwoJCQljb250Kys7CgkJfQoJCWZyZWUgKGxzdCAtPiB1bHQpOwoJCWxzdCAtPiB1bHQgPSBhdXhObzsKCX0KCQoJbHN0IC0+IHRhbS0tOwoJcmV0dXJuIGxzdDsKfQoKCi8qIGZhbHRhIGVzc2EgZGFxdWkgKi8KaW50IG9idGVyKGxpc3RhICpsc3QsIGludCBwb3MpCnsKCWludCBpID0gMDsKCW5vICpub0F1eCA9IGxzdCAtPiBwcmltOwoJCglpZiAocG9zID09IDApCgl7CgkJcmV0dXJuIGxzdCAtPiBwcmltIC0+IHZhbG9yOwoJfQkKCWVsc2UgaWYgKChwb3MgPiAwKSAmJiAocG9zIDwgbHN0LT50YW0gLSAxKSkKCXsKCQl3aGlsZShpIDwgcG9zKQoJCXsKCQkJbm9BdXggPSBub0F1eCAtPiBwcm94OwoJCQlpKys7CgkJfQoJCXJldHVybiBub0F1eCAtPiB2YWxvcjsKCX0KCWVsc2UKCXsKCQlyZXR1cm4gbHN0IC0+IHVsdCAtPiB2YWxvcjsKCX0KfQoKCmludCB0YW1hbmhvKGxpc3RhICpsc3QpCnsKCXJldHVybiBsc3QgLT4gdGFtOwp9IAoKCgp2b2lkIGRlc3RydWlyTGlzdGEobGlzdGEgKmxzdCkKewoJbm8gKmF1eE5vOwoJCgl3aGlsZSAobHN0IC0+IHByaW0gIT0gTlVMTCkKCXsKCQlhdXhObyA9IGxzdCAtPiBwcmltOwoJCWxzdCAtPiBwcmltID0gYXV4Tm8gLT4gcHJveDsKCQlmcmVlKGF1eE5vKTsKCX0KCQoJZnJlZShsc3QpOwp9CgoKaW50IG1haW4oKQp7CgkvKiBjcmlhbmRvIHBlc3NvYXMgKi8KCXBlc3NvYSAqcDEgPSBjcmlhUGVzc29hKCJhbm5lIiwgMjQpOwoJcGVzc29hICpwMiA9IGNyaWFQZXNzb2EoImpvw6NvIiwgMjEpOwoJcGVzc29hICpwMiA9IGNyaWFQZXNzb2EoIm1hcmlhIiwgMjApOwoJCgkKCS8qIHRlc3RhIGZ1bsOnw6NvIGNyaWFyTGlzdGEgKi8KCWxpc3RhICpsc3QgPSBjcmlhTGlzdGEoKTsKCQoJLyogdGVzdGEgZnVuw6fDo28gaW5zZXJpciAqLwoJaW5zZXJpcihsc3QsIHAxKTsKCWluc2VyaXIobHN0LCBwMik7CgoJCgkvKiB0ZXN0YSBmdW7Dp8OjbyBpbnNlcmlyUG9zICovCglpbnNlcmlyUG9zKGxzdCwgMiwgcDMpOwoJCgkvKiB0ZXN0YSBmdW7Dp8OjbyBpbXByaW1pciAqLwoJaW1wcmltaXIobHN0KTsKCQoJLyogdGVzdGEgZnVuw6fDo28gdGFtYW5obyAqLwoJcHJpbnRmKCJUZXN0ZSBkYSBmdW7Dp8OjbyB0YW1hbmhvKCk6ICVkXG4iLCB0YW1hbmhvKGxzdCkpOwoJCgkvKiB0ZXN0YSBmdW7Dp8OjbyBvYnRlciAqLwoJcHJpbnRmKCJUZXN0ZSBkYSBmdW7Dp8OjbyBvYnRlcigpOiAlZFxuIiwgb2J0ZXIobHN0LCAyKSk7CgkKCQoJLyogdGVzdGEgZnVuw6fDo28gcmVtb3ZlciAKCXJlbW92ZXIobHN0LCAwKTsJCglpbXByaW1pcihsc3QpOyovCgkKCQoJLyogdGVzdGEgZnVuw6fDo28gZGVzdHJ1aXJMaXN0YSAKCWRlc3RydWlyTGlzdGEobHN0KTsqLwoJCglyZXR1cm4gMDsKfQ==
compilation info
prog.c: In function ‘criaNo’:
prog.c:57:5: error: ‘no {aka struct no}’ has no member named ‘valor’
no -> valor = n;
^~
prog.c: At top level:
prog.c:73:1: error: ‘void’ must be the only parameter
lista *inserir(lista *lst, void )
^~~~~
prog.c: In function ‘inserir’:
prog.c:75:22: error: ‘val’ undeclared (first use in this function)
no *novoNo = criaNo(val);
^~~
prog.c:75:22: note: each undeclared identifier is reported only once for each function it appears in
prog.c: In function ‘inserirPos’:
prog.c:90:22: warning: passing argument 1 of ‘criaNo’ makes pointer from integer without a cast [-Wint-conversion]
no *novoNo = criaNo(val);
^~~
prog.c:53:5: note: expected ‘void *’ but argument is of type ‘int’
no *criaNo(void *n)
^~~~~~
prog.c: In function ‘obter’:
prog.c:175:22: error: ‘struct no’ has no member named ‘valor’
return lst -> prim -> valor;
^~
prog.c:184:16: error: ‘no {aka struct no}’ has no member named ‘valor’
return noAux -> valor;
^~
prog.c:188:21: error: ‘struct no’ has no member named ‘valor’
return lst -> ult -> valor;
^~
prog.c: In function ‘main’:
prog.c:218:26: warning: passing argument 1 of ‘criaPessoa’ makes integer from pointer without a cast [-Wint-conversion]
pessoa *p1 = criaPessoa("anne", 24);
^~~~~~
prog.c:62:9: note: expected ‘char’ but argument is of type ‘char *’
pessoa *criaPessoa(char nome, int idade)
^~~~~~~~~~
prog.c:219:26: warning: passing argument 1 of ‘criaPessoa’ makes integer from pointer without a cast [-Wint-conversion]
pessoa *p2 = criaPessoa("joão", 21);
^~~~~~~
prog.c:62:9: note: expected ‘char’ but argument is of type ‘char *’
pessoa *criaPessoa(char nome, int idade)
^~~~~~~~~~
prog.c:220:10: error: redefinition of ‘p2’
pessoa *p2 = criaPessoa("maria", 20);
^~
prog.c:219:10: note: previous definition of ‘p2’ was here
pessoa *p2 = criaPessoa("joão", 21);
^~
prog.c:220:26: warning: passing argument 1 of ‘criaPessoa’ makes integer from pointer without a cast [-Wint-conversion]
pessoa *p2 = criaPessoa("maria", 20);
^~~~~~~
prog.c:62:9: note: expected ‘char’ but argument is of type ‘char *’
pessoa *criaPessoa(char nome, int idade)
^~~~~~~~~~
prog.c:227:2: error: too many arguments to function ‘inserir’
inserir(lst, p1);
^~~~~~~
prog.c:73:8: note: declared here
lista *inserir(lista *lst, void )
^~~~~~~
prog.c:228:2: error: too many arguments to function ‘inserir’
inserir(lst, p2);
^~~~~~~
prog.c:73:8: note: declared here
lista *inserir(lista *lst, void )
^~~~~~~
prog.c:232:21: error: ‘p3’ undeclared (first use in this function)
inserirPos(lst, 2, p3);
^~
prog.c:235:2: warning: implicit declaration of function ‘imprimir’ [-Wimplicit-function-declaration]
imprimir(lst);
^~~~~~~~
prog.c: In function ‘obter’:
prog.c:190:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
stdout