Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #define MAX 5
- typedef struct{
- int ch;
- int prox;
- }REGISTRO;
- typedef struct{
- REGISTRO A[MAX];
- int inicio;
- int dispo;
- }LISTA;
- void inicializar(LISTA *l){
- l->inicio = -1;
- l->dispo = 0;
- int i;
- for(i=0;i<MAX-1;i++){
- l->A[i].prox = i+1;
- }
- l->A[MAX-1].prox = -1; //última posição aponta para o fim do vetor (-1)
- }
- // Obter nó disponível - a lista é alterada
- int obterNo(LISTA *l)
- {
- int result = l->dispo;
- if(l->dispo > -1) {
- l->dispo = l->A[l->dispo].prox;
- }
- return(result);
- }
- // Devolver nó p/ dispo – a lista é alterada
- void devolverNo(LISTA *l, int j)
- {
- l->A[j].prox= l->dispo;
- l->dispo = j;
- }
- int busca(LISTA l, int ch, int *ant)
- {
- int i = l.inicio;
- while(i != -1){
- if(l.A[i].ch == ch) return i;
- *ant = i;
- i = l.A[i].prox;
- }
- return -1;
- }
- bool anexar(LISTA *l, int ch)
- {
- int ant, i;
- i = busca(*l, ch, &ant);
- if((l->dispo < 0) || (i != -1)) return(false);
- i = obterNo(l);
- l->A[i].ch = ch;
- if(l->inicio<0)
- {
- // inserção do primeiro elemento de lista vazia
- l->inicio = i;
- l->A[i].prox = -1;
- }
- else
- {
- if(ant < 0)
- {
- // inserção no início de lista já existente
- l->A[i].prox = l->inicio;
- l->inicio = i;
- }
- else
- {
- // inserção entre dois elementos
- l->A[i].prox = l->A[ant].prox;
- l->A[ant].prox = i;
- }
- }
- return(true);
- }
- int size(LISTA *l){
- int i = l->inicio;
- int cont;
- while(i != -1){
- cont++;
- i = l->A[i].prox;
- }
- return cont;
- }
- bool inserir(LISTA *l, int pos, int ch)
- {
- int ant;
- int i;
- i = busca(*l, ch, &ant);
- if(pos<0 || pos>=MAX || pos > size(l) ||i != -1) return false;
- i = obterNo(l);
- l->A[i].ch = ch;
- if(pos == 0)
- {
- l->A[pos].prox = l->inicio;
- l->inicio = pos;
- return true;
- }
- int cont = l->inicio;
- while(cont != -1)
- {
- if(cont == pos-1)
- {
- if(l->A[l->A[pos].prox].prox != -1)
- {
- l->A[pos].prox = l->A[cont].prox;
- l->A[cont].prox = pos;
- return true;
- }
- else
- {
- l->A[pos].prox = -1;
- l->A[cont].prox = pos;
- return true;
- }
- }
- else
- {
- ant = cont;
- cont = l->A[cont].prox;
- }
- }
- }
- bool excluir(LISTA *l, int ch){
- int ant;
- int posicao = busca(*l,ch,&ant);
- if(posicao == -1) return false;
- if(ant == -1) l->inicio = l->A[posicao].prox;
- else l->A[ant].prox = l->A[posicao].prox;
- devolverNo(l,posicao);
- return true;
- }
- void exibir(LISTA l){
- int i = l.inicio;
- while(i != -1){
- printf("%i\n", l.A[i].ch);
- i = l.A[i].prox;
- }
- }
- void exibirVazia(LISTA l){
- int i = l.dispo;
- while(i != -1){
- printf("%i\n", i);
- i = l.A[i].prox;
- }
- }
- main(){
- LISTA l;
- inicializar(&l);
- anexar(&l, 10);
- anexar(&l, 11);
- anexar(&l, 12);
- excluir(&l, 11);
- inserir(&l, 1, 5);
- exibir(l);
- inserir(&l, 4, 6); /// olha aqui o problema a lista acaba no indice 2 e eu to querendo inserir no indice 4
- exibir(l);
- getch();
- }
Advertisement
Add Comment
Please, Sign In to add comment