Ir ao conteúdo
  • Cadastre-se

C Lista encadeada - Erro de execução


Carol Alves
Ir à solução Resolvido por Carol Alves,

Posts recomendados

Olá pessoal, tudo bem?

Preciso de uma ajuda para descobrir o erro, se puderem também aceito material de estudo, o que acontece é que eu já rodei esse código de cima a baixo e ele continua dando problema na função:

Buscar: mesmo quando não existe o valor ele retorna uma posição;

Excluir: ele não exclui o valor quando ele está na primeira posição;

Excluir tudo: após usar quando peço para imprimir o programa dá erro

#include<stdio.h>
#include<stdlib.h>

//criação da lista - recebe um inteiro e tem um ponteiro
//*ini é o ponteiro inicial (um ponteiro que aponta para outro ponteiro)

struct No{
    int dado;
    struct No *prox;
} *ini=NULL;

void inserir_ini(int num){
    struct No *novo; // nova estrutura com características de No
    novo = malloc(sizeof(No())); //pegar um espaço de memoria
    novo->dado=num; //informação de novo agora é num
    novo->prox=ini; //ponteiro de novo aponta para ini (primeiro da lista) último da lista
    ini=novo; // ponteiro de ini aponta para novo
    }

void inserir_fim(int num){
    struct No *aux =ini, *novo; // novo ponteiro e nova estrutura com características de No
    novo = malloc(sizeof(No())); //pegar um espaço de memoria
    novo->dado=num; //informação de novo agora é num
    novo->prox=NULL; //ponteiro de novo aponta para NULL

    if(aux==NULL){
        ini=novo; //se não tinha nada na lista, ini apontava para null, logo aux aponta para null, nesse caso ini vai apontar para o primeiro da lista
    }
    else{
        while(aux->prox !=NULL){
            aux=aux->prox;
        }
        aux->prox=novo; //procura o último da lista e conecta o novo nele
    }
}


void imprimir(){

    struct No*novo; //criou um ponteiro igual ao no

     if (ini == NULL)
  {
    printf("--- fim da lista ---\n\n");
    return;
  }

  novo = ini;
  while (novo !=NULL) {
     printf("Info = %d\n",novo->dado);
     novo = novo->prox;
  }
  printf("--- fim da lista ---\n\n");
}

void buscar (int busca, struct No*ini){

    int contador=1;
    struct No *q;
    q = ini;


    while (q != NULL && q->dado != busca) {
        q = q->prox;
        contador=contador+1;
    }

    printf("O valor inserido está na posição %d",contador);

}

void alterar(int alvo, int alvo2, struct No*ini){

    struct No *q;
    q = ini;

    while (q != NULL && q->dado != alvo) {
        q = q->prox;
    }
    if (q != NULL) {
        q->dado=alvo2;
    }
}

void excluir(int alvo, struct No*ini){

    struct No *p,*q;
    p=ini;
    q=ini->prox;

    if (q->dado==alvo)

    while (q != NULL && q->dado != alvo) {
        p = q;
        q = q->prox;
    }

    if (q != NULL) {
        p->prox = q->prox;
        free (q);
    }
}

void excluirtudo(struct No*ini){

    struct No *aux;

    while (ini!= NULL) {
        aux = ini;
        ini=aux->prox;
        free(aux);
    }

    ini->prox=NULL;
}


int main(){
    int op=1, num, num2,busca;

    while (op!=0){

    printf("\n\nMenu \n1-Insere no inicio; \n2-Insere no fim; \n3-Imprime; \n4-Buscar \n5-Alterar \n6-Excluir um \n7-Excluir tudo \n0-Finaliza \n\n Digite a opcao: ");
    scanf("%d", &op);

        switch(op){
        case 1:
            printf("\nInsira um numero: ");
            scanf("%d",&num);
            inserir_ini(num);
            break;

        case 2:
            printf("\nInsira um numero: ");
            scanf("%d",&num);
            inserir_fim(num);
            break;

        case 3:
            imprimir();
            break;

        case 4:
            printf("Insira o numero que deseja buscar:");
            scanf("%d",&busca);
            buscar(busca,ini);
            break;

        case 5:
            printf("\nInsira o numero que deseja substituir: ");
            scanf("%d",&num);

            printf("\nInsira o novo numero: ");
            scanf("%d",&num2);

            alterar(num,num2, ini);
            break;

        case 6:
            printf("\nInsira o numero que deseja excluir: ");
            scanf("%d",&num);
            excluir(num, ini);
            break;

        case 7:
            excluirtudo(ini);
            printf("\nLista deletada.");
            break;

        }
    }
}

 

Link para o comentário
Compartilhar em outros sites

53 minutos atrás, Carol Alves disse:

Buscar: mesmo quando não existe o valor ele retorna uma posição;

E vai retornar mesmo, porque se você inicializaou o contador como 1, mesmo que não encontre nada, pelo fonte como não alterou o valor de contador, ele continuará sendo 1.

 

 

53 minutos atrás, Carol Alves disse:

Excluir: ele não exclui o valor quando ele está na primeira posição;

você já começou dizendo que if (q->dado==alvo), mas se quer retirar do nó raiz, deveria ter feito algo como if (p->dado==alvo) ?
 

 

53 minutos atrás, Carol Alves disse:

Excluir tudo: após usar quando peço para imprimir o programa dá erro


Que tipo de erro?

Eu imagino que quando se está trabalhando com nós, na exclusão deve-se começar excluindo os nos folhas e depois ir subindo até o nó raiz. tá estranho isso ai...

E olha como você fez um malloc:
novo = malloc(sizeof(No()));

Não deveria ser assim?
novo = malloc(sizeof(No));


 

parece uma mesma variação da pergunta feita aqui:
https://www.clubedohardware.com.br/forums/topic/1562825-erro-ao-abrir-arquivo-txt/?tab=comments#comment-8267504


E a resposta que lhe digo é a mesma que postei ao usuário...
primeiro deveria entender os pre-requisitos, como o funcionamento do switch-case.
De onde iria tirar os dados depois de pedir pra imprimir? Sabe responder pelo menos isso?
Se não...
 

Citação

O senhor(a) está estudando da forma errada.
Quando a gente quer estudar algo, a gente deve começar pelo inicio...
Quero dizer, pelo que entendi, que o senhor quer criar um aquivo e escrever nele alguns dados. Depois, quer abrir ele novamente e ler esses dados. Mas você não sabe usar um case ainda.
O básico é começar assim:
saber e declarar tipos de variaveis como int, char, Ponteiros como *char...
Depois saber como ler o conteudo dessas variaiveis e imprimir.
depois saber condicionais... fazer um if, if-else, e else if... switch-case
Depois saber como realizar um loops como for, do-while, while...
Structs, unions, ...
funções, como chamar funções, como passar parametros...
Acho que por ai já é um bom começo pra depois tentar entender como trabalhar com arquivos.
É possivel que eu esteja esquecendo alguma outra precedencia, mas não se preocupe. Pesquisando comando por comando e tentando executar cada um deles, separadamente, você vai consequir aprender.

 

Link para o comentário
Compartilhar em outros sites

@codigo rápido oi, o buscar quando o número está na lista funciona, por exemplo:

Lista= 1, 2, 3, 4

Buscar 4

Retorno: "O número buscado está na posição 4"

 

O problema é quando o número não existe na lista, por exemplo 

Buscar 5

Retorno: "O número buscado está na posição 5"

 

Eu entendo porque isso acontece, porque o programa entrou no laço do While 5 vezes até dar null, por isso ele tá apresentando esse erro, o ponto é que eu não sei como fazer o programa entender que se ele não achar o número buscado ele não deve ter um contador.

 

 

 

Link para o comentário
Compartilhar em outros sites

7 minutos atrás, Carol Alves disse:

@codigo rápido oi, o buscar quando o número está na lista funciona, por exemplo:

Lista= 1, 2, 3, 4

Buscar 4

Retorno: "O número buscado está na posição 4"

 

O problema é quando o número não existe na lista, por exemplo 

Buscar 5

Retorno: "O número buscado está na posição 5"

 

Eu entendo porque isso acontece, porque o programa entrou no laço do While 5 vezes até dar null, por isso ele tá apresentando esse erro, o ponto é que eu não sei como fazer o programa entender que se ele não achar o número buscado ele não deve ter um contador.

 

 

 

aquenta ai que eu vou olhar aqui com mais calma. Que a pouco retorno.

Link para o comentário
Compartilhar em outros sites

@codigo rápido sobre alguém fazer pra mim, não é a itenção, por isso não trouxe o enunciado do que estou tentando fazer, trouxe já o código que eu desenhei e está depurando, mas apresenta falhas :(

 

Usei o fórum porque algumas vezes alguém que já trabalha com listas encadeadas poderia me dar um insight que me ajudaria a matar a charada de onde está o erro, porque observando os erros já percebi  que acontece no geral  envolvendo o primeiro ponteiro.

@codigo rápido super obrigadaaa, eu já tô há dias nesse código, qualquer insight que me dê uma luz de onde tá meu erro é super bem vindo :)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

você já começou usando sua struct nó como uma variavel global. isso não é muito legal. Eu vou mudar algumas coisas. Isso pode demorar um pouquinho porque tá dando uns erros aqui, mas assim que eu terminar mando. Melhor ir dormir e esperar até de manhã pra ver porque não sei qt tempo vou levar.

Link para o comentário
Compartilhar em outros sites

#include<stdio.h>
#include<stdlib.h>

//criação da lista - recebe um inteiro e tem um ponteiro
//*ini é o ponteiro inicial (um ponteiro que aponta para outro ponteiro)

struct No
{
	int dado;
	struct No *prox;
} *ini=NULL;

void inserir_ini(int num){
	struct No *novo; // nova estrutura com características de No
	novo = malloc(sizeof(struct No)); //pegar um espaço de memoria
	novo->dado=num; //informação de novo agora é num
	novo->prox=ini; //ponteiro de novo aponta para ini (primeiro da lista) último da lista
	ini=novo; // ponteiro de ini aponta para novo
	}

void inserir_fim(int num){
	struct No *aux =ini, *novo; // novo ponteiro e nova estrutura com características de No
	novo = malloc(sizeof(struct No)); //pegar um espaço de memoria
	novo->dado=num; //informação de novo agora é num
	novo->prox=NULL; //ponteiro de novo aponta para NULL

	if(aux==NULL){
		ini=novo; //se não tinha nada na lista, ini apontava para null, logo aux aponta para null, nesse caso ini vai apontar para o primeiro da lista
	}
	else{
		while(aux->prox !=NULL){
			aux=aux->prox;
		}
		aux->prox=novo; //procura o último da lista e conecta o novo nele
	}
}


void imprimir(){

	struct No*novo; //criou um ponteiro igual ao no

	 if (ini == NULL)
  {
	printf("--- fim da lista ---\n\n");
	return;
  }

  novo = ini;
  while (novo !=NULL) {
	 printf("Info = %d\n",novo->dado);
	 novo = novo->prox;
  }
  printf("--- fim da lista ---\n\n");
}

void buscar (int busca, struct No*ini){

	int contador=1;
	struct No *q;
	q = ini;


	while (q != NULL && q->dado != busca) {
		q = q->prox;
		contador=contador+1;
	}

	printf("O valor inserido está na posição %d",contador);

}

void alterar(int alvo, int alvo2, struct No*ini){

	struct No *q;
	q = ini;

	while (q != NULL && q->dado != alvo) {
		q = q->prox;
	}
	if (q != NULL) {
		q->dado=alvo2;
	}
}

void excluir(int alvo, struct No*ini){

	struct No *p,*q;
	p=ini;
	q=ini->prox;

	if (q->dado==alvo)

	while (q != NULL && q->dado != alvo) {
		p = q;
		q = q->prox;
	}

	if (q != NULL) {
		p->prox = q->prox;
		free (q);
	}
}


void excluirtudo(struct No *no)
{
	if(no->prox!= NULL)
	{
		excluirtudo(no->prox);
	}
	no->prox=NULL;
	free(no);
	printf("excluiu...\n");
}

int main(){
	int op=1, num, num2,busca;

	while (op!=0){

	printf("\n\nMenu \n1-Insere no inicio; \n2-Insere no fim; \n3-Imprime; \n4-Buscar \n5-Alterar \n6-Excluir um \n7-Excluir tudo \n0-Finaliza \n\n Digite a opcao: ");
	scanf("%d", &op);

		switch(op){
		case 1:
			printf("\nInsira um numero: ");
			scanf("%d",&num);
			inserir_ini(num);
			break;

		case 2:
			printf("\nInsira um numero: ");
			scanf("%d",&num);
			inserir_fim(num);
			break;

		case 3:
			imprimir();
			break;

		case 4:
			printf("Insira o numero que deseja buscar:");
			scanf("%d",&busca);
			buscar(busca,ini);
			break;

		case 5:
			printf("\nInsira o numero que deseja substituir: ");
			scanf("%d",&num);

			printf("\nInsira o novo numero: ");
			scanf("%d",&num2);

			alterar(num,num2, ini);
			break;

		case 6:
			printf("\nInsira o numero que deseja excluir: ");
			scanf("%d",&num);
			excluir(num, ini);
			break;

		case 7:
			excluirtudo(ini);
			printf("\nLista deletada.");
			break;

		}
	}
}


Deu uma melhorada, mas ainda não está bom. Da pra melhor melhorar mais.
Por exemplo você deve evitar variaveis globais. Eu até tentei mudar isso, mas começou a aparecer muitos erros e eu não terei tempo pra ver isso agora.
Quem sabe outros pegando de onde parei?
 

Link para o comentário
Compartilhar em outros sites

Olá

 

Devia ter postado o enunciado.  Poste o código como está agora (mesmo que tenha resolvido, assim ajuda a outros).

 

Do modo como escreveu, que é comum, vai ter sempre muito mais  trabalho para escrever, para mudar ou para reutilizar isso.

 

Listas são containers de coisas. Tem até esse nome em C. Em java são chamadas coleções.

Uma lista tem nós, e os nós contem dados. Em geral ponteiros para os dados e não os dados de fato. E no dado tem um campo que é a chave, o campo que você usa para comparar um registro com outro.

 

No seu caso o dado é apenas um número e essa parte do campo chave é fácil: só tem um mesmo ;) 

 

No nó ter ponteiros para um lado só é um pesadelo. SEMPRE use dois a menos que o enunciado obrigue ou tenha uma máquina muito limitada E um número enorme de registros.

 

Como você deve ter percebido, sem ponteiros para os dois lados navegar é um pesadelo e toda hora é preciso se reposicionar a partir do início. Ou do final. Muito mais complicado.

 

Ainda sobre seu programa

 

Ao invés disso

 

struct No
{
    int        dado;
    struct No *prox;
} *ini = NULL;

 

prefira sempre algo assim:

 


typedef Dado int;

typedef struct sno
{
    Dado *      dado;
    struct sno *ant;
    struct sno *prox;

}   No;

typedef struct
{
    No*         inicio;
    No*         fim;

    unsigned    size;

}   Lista;

int         alterar_dado(Dado*, Dado*, List*);
int         apagar_dado(Dado*,List*);
List*       apagar_lista(List*);
int         buscar(Dado*, List*);
List*       criar_lista();
int         inserir_ini(Dado*, List*);
int         inserir_fim(Dado*, List*);
int         mostrar_lista(List*,const char*);

 

porque é muito mais simples. Se precisa usar um só ponteiro apenas apague ou não use o outro.

 

  • assim é flexível: tanto faz usar int ou algo muito complicado como dado. Não vai mais precisar mexer nisso em outros programas
  • todos os dados da lista ficam DENTRO da lista. Não precisa controlar nada
  • usa apenas endereços.  Não depende de mais nada
  • sem void: retorna um status. Em C em geral zero se deu certo. Um valor negativo para erro.
  • main() deve ser a primeira função do programa, se possível em um arquivo separado
  • NUNCA escreva um programa interativo antes de estarem prontas as funções
  • não misture lógica com entrada e saída de dados

 

 

 

Ao invés de 

 

        printf(
            "\n\nMenu \n1-Insere no inicio; \n2-Insere no fim; "
            "\n3-Imprime; \n4-Buscar \n5-Alterar \n6-Excluir um "
            "\n7-Excluir tudo \n0-Finaliza \n\n Digite a opcao: ");

 

prefira sempre

 

        printf("\
\n\
\n\
Menu\n\
1-Insere no inicio; \n\
2-Insere no fim;\n\
3-Imprime;\n\
4-Buscar\n\
5-Alterar\n\
6-Excluir um\n\
7-Excluir tudo\n\
0-Finaliza\n\
\n\
\n\
 Digite a opcao: ");

 

Que é muito mais fácil de ler e alterar...

 

  • TESTE SEMPRE o retorno de scanf(). Qual o sentido se seguir se não ler nada? Que opção vai usar no switch?
  • Se tem um menu use uma função que mostra o menu e retorna a opção. É o simples. Muito mais simples.

 

Link para o comentário
Compartilhar em outros sites

Já tô fazendo vários ajustes com os feedbacks de vocês.

Consegui arrumar a função excluir tudo, ficou assim:

Citação

int excluirtudo(struct No*ini){

    struct No *aux;

    while (ini!= NULL) {
        aux = ini;
        ini=aux->prox;
        free(aux);
    }

    return NULL;
}

 

Na função principal coloquei:

 

Citação

        case 7:

            ini=excluirtudo(ini);
            printf("\nLista deletada.");
            break;

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

12 minutos atrás, Carol Alves disse:

int excluirtudo(struct No*ini)

 

Já sabe quantos são, então o mais simples para excluir tudo é excluir 1 a 1 os N registros

 

Use um typedef no caminho do que eu te expliquei. É mais simples e não precisa ficar repetindo struct toda hora. É o comum.

 

15 minutos atrás, Carol Alves disse:

ini=excluirtudo(ini);

 

Fez bem em escrever assim, desde que excluir tudo retorne NULL.

 

POSTE o código completo.

Link para o comentário
Compartilhar em outros sites

  • Solução

Pessoal, agora resolvi o problema do excluir 1, eu estava pulando o no inicial, segue código correto:

Citação

struct No excluir(int alvo, struct No*ini){

    struct No *p,*q,*aux;
    p=aux=ini;
    q=ini->prox;

    if (p!=NULL && p->dado== alvo){
        aux=p->prox;
        free(p);
    }

    while (q != NULL && q->dado != alvo) {
        p = q;
        q = q->prox;
    }

    if (q != NULL) {
        p->prox = q->prox;
        free (q);
    }
    return *aux;
}

 

A estrutura case fica:

 

Citação

        case 6:
            printf("\nInsira o numero que deseja excluir: ");
            scanf("%d",&num);
            *ini=excluir(num, ini);
            break;

 

Tudo resolvido, não tá da forma mais inteligente do mundooo hahaha mas tá funcionando, obrigada pessoal!

 

Citação

#include<stdio.h>
#include<stdlib.h>

//criação da lista - recebe um inteiro e tem um ponteiro
//*ini é o ponteiro inicial (um ponteiro que aponta para outro ponteiro)

struct No{
    int dado;
    struct No *prox;
} *ini=NULL;

void inserir_ini(int num){
    struct No *novo; // nova estrutura com características de No
    novo = malloc(sizeof(No())); //pegar um espaço de memoria
    novo->dado=num; //informação de novo agora é num
    novo->prox=ini; //ponteiro de novo aponta para ini (primeiro da lista) último da lista
    ini=novo; // ponteiro de ini aponta para novo
    }

void inserir_fim(int num){
    struct No *aux =ini, *novo; // novo ponteiro e nova estrutura com características de No
    novo = malloc(sizeof(No())); //pegar um espaço de memoria
    novo->dado=num; //informação de novo agora é num
    novo->prox=NULL; //ponteiro de novo aponta para NULL

    if(aux==NULL){
        ini=novo; //se não tinha nada na lista, ini apontava para null, logo aux aponta para null, nesse caso ini vai apontar para o primeiro da lista
    }
    else{
        while(aux->prox !=NULL){
            aux=aux->prox;
        }
        aux->prox=novo; //procura o último da lista e conecta o novo nele
    }
}


void imprimir(){

    struct No*novo; //criou um ponteiro igual ao no

     if (ini == NULL)
  {
    printf("--- fim da lista ---\n\n");
    return;
  }

  novo = ini;
  while (novo !=NULL) {
     printf("Info = %d\n",novo->dado);
     novo = novo->prox;
  }
  printf("--- fim da lista ---\n\n");
}

void buscar (int busca, struct No*ini){

    int contador=1,teste=0;
    struct No *q, *aux;
    q = aux=ini;


    while(aux!=NULL){
        aux=aux->prox;
        teste=teste+1;
    }

    while (q != NULL && q->dado != busca) {
        q = q->prox;
        contador=contador+1;
    }

    if(contador<teste){
    printf("\n\nO valor inserido está na posição %d",contador);
    }else{
    printf("O valor buscado não existe na lista.");
    }
}

void alterar(int alvo, int alvo2, struct No*ini){

    struct No *q;
    q = ini;

    while (q != NULL && q->dado != alvo) {
        q = q->prox;
    }
    if (q != NULL) {
        q->dado=alvo2;
    }
}

struct No excluir(int alvo, struct No*ini){

    struct No *p,*q,*aux;
    p=aux=ini;
    q=ini->prox;

    if (p!=NULL && p->dado== alvo){
        aux=p->prox;
        free(p);
    }

    while (q != NULL && q->dado != alvo) {
        p = q;
        q = q->prox;
    }

    if (q != NULL) {
        p->prox = q->prox;
        free (q);
    }
    return *aux;
}

int excluirtudo(struct No*ini){

    struct No *aux;

    while (ini!= NULL) {
        aux = ini;
        ini=aux->prox;
        free(aux);
    }

    return NULL;
}

int main(){
    int op=1, num, num2,busca,posi;

    while (op!=0){

        printf("\
\n\
\n\
Menu\n\
1-Insere no inicio; \n\
2-Insere no fim;\n\
3-Imprime;\n\
4-Buscar\n\
5-Alterar\n\
6-Excluir um\n\
7-Excluir tudo\n\
0-Finaliza\n\
\n\
\n\
Digite a opcao: ");
     scanf("%d", &op);

        switch(op){
        case 1:
            printf("\nInsira um numero: ");
            scanf("%d",&num);
            inserir_ini(num);
            break;

        case 2:
            printf("\nInsira um numero: ");
            scanf("%d",&num);
            inserir_fim(num);
            break;

        case 3:
            imprimir();
            break;

        case 4:
            printf("Insira o numero que deseja buscar:");
            scanf("%d",&busca);
            buscar(busca,ini);

            break;

        case 5:
            printf("\nInsira o numero que deseja substituir: ");
            scanf("%d",&num);

            printf("\nInsira o novo numero: ");
            scanf("%d",&num2);

            alterar(num,num2, ini);
            break;

        case 6:
            printf("\nInsira o numero que deseja excluir: ");
            scanf("%d",&num);
            *ini=excluir(num, ini);
            break;

        case 7:

            ini=excluirtudo(ini);
            printf("\nLista deletada.");
            break;

        }
    }
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Eu peguei de novo mais cedo, mas ainda não terminei. vou ter que parar de novo pra resolver outras coisas, mas aqui compartilho com vcs. Tireia a variavel global. Mais tarde pego de novo:
 

#include<stdio.h>
#include<stdlib.h>
typedef struct
{
	int dado;
	long unsigned int next, before;
}No;
No *createNode(int val)
{
	No *newNode = malloc(sizeof(No));
	newNode->dado = val;
	newNode->next = 0;
	return newNode;
}
No *insertInitNode(int num, No *Node)
{
	No *novo = malloc(sizeof(No));
	novo->next=(long unsigned int)Node;
	novo->dado=num;
	return novo;
}
No *insertEndNode(int num, No *Node)
{
	No *aux = Node;
	No *novo;
	novo = malloc(sizeof(No));
	novo->dado=num; 
	novo->next=0;
	while(aux->next!=0)
	{
		aux=(No*)aux->next;
	}
	aux->next=(long unsigned int)novo;
	return Node;
}
void findInNode(int busca, No *Node)
{
	int contador=1;
	No *aux;
	aux = Node;
	while (aux->next!=0 && aux->dado!=busca) 
	{
		aux = (No*)aux->next;
		contador=contador+1;
	}
	if(aux->dado==busca)
	{
		printf("O valor procurado está na posição %d\n",contador);
	}
	else
	{
		printf("O valor não encontrado\n");
	}
}
No *EditValueNode(int target, int target2, No *Node)
{
	No *aux;
	aux = Node;
	while (aux->next!=0 && aux->dado!=target) 
	{
		aux =  (No*)aux->next;
		if (aux!=NULL && aux->dado==target) 
		{
			aux->dado=target2;
		}
	}
	return Node;
}

No *EditNode(int target, int value, No *Node)
{
	int contador=1;
	No *aux;
	aux = Node;
	while (aux->next!=0 && contador!=target) 
	{
		aux = (No*)aux->next;
		contador=contador+1;
	}
	if(contador==target)
	{
		aux->dado=value;
	}
	else
	{
		printf("No não encontrado\n");
	}
	return Node;
}
No *deleteValueInNode(int target, No *Node)
{
	No *aux = Node;
	No *novo;
	int x; // x momentaneo para parar a recursividade
	while(aux->next!=0 && x<10)
	{
		aux=(No*)Node->next;
		x++;
	}
	aux->next=(long unsigned int)novo;
	return Node;
}
//===================================
void imprimir(No *Node)
{
	if(Node!=NULL)
	{
		if (Node->next!=0);
		{
			No *novo;
			novo=(No*)Node->next;
			imprimir(novo);
		}
		printf("Dado = %d\n",Node->dado);
	}
}
int main()
{
	printf("------------------------ createNode\n");
	No *node = createNode(3);
	imprimir(node);
	printf("------------------------ insertInitNode\n");

	node = insertInitNode(2, node);
	node = insertInitNode(2, node);
	node = insertInitNode(1, node);
	imprimir(node);
	printf("------------------------ insertEndNode\n");

	node = insertEndNode(4, node);
	imprimir(node);
	printf("------------------------ findInNode\n");

	findInNode(2, node);
	findInNode(6, node);
	printf("------------------------ EditValueNode\n");

	node = EditValueNode(2, 3, node);
	imprimir(node);
	printf("------------------------ EditNode\n");

	node = EditNode(2, 6, node);
	imprimir(node);
	printf("------------------------ deleteValueInNode\n");

	node = deleteValueInNode(6, node);
	imprimir(node);
	printf("------------------------\n");

	return 0;
}



/*

void excluir(int target, struct No*ini){

	struct No *p,*q;
	p=ini;
	q=ini->prox;

	if (q->dado==target)

	while (q != NULL && q->dado != target) {
		p = q;
		q = q->prox;
	}

	if (q != NULL) {
		p->prox = q->prox;
		free (q);
	}
}


void excluirtudo(struct No *no)
{
	if(no->prox!= NULL)
	{
		excluirtudo(no->prox);
	}
	no->prox=NULL;
	free(no);
	printf("excluiu...\n");
}

*/

 

Parei onde em excluir. Assim que eu voltar pego de novo pra terminar.

Link para o comentário
Compartilhar em outros sites

9 horas atrás, Carol Alves disse:

struct No excluir(int alvo, struct No*ini){

    struct No *p,*q,*aux;
    p=aux=ini;
    q=ini->prox;

 

 

Vejo que preferiu não escrever do modo como te expliquei ;)

 

Notou que tem nada menos que  4 ponteiros para struct No* aqui? Deve ter outra maneira de escrever isso...

 

9 horas atrás, Carol Alves disse:

//criação da lista - recebe um inteiro e tem um ponteiro
//*ini é o ponteiro inicial (um ponteiro que aponta para outro ponteiro)

struct No{
    int dado;
    struct No *prox;
} *ini=NULL;

 

 

ini não é um ponteiro que aponta para outro ponteiro. A declaração está aí, e ini é struct No*

 

9 horas atrás, Carol Alves disse:

A estrutura case fica:

 

Citação

        case 6:
            printf("\nInsira o numero que deseja excluir: ");
            scanf("%d",&num);
            *ini=excluir(num, ini);
            break;

 

 

Teste o retorno de scanf(). SEMPRE. É ingênuo não testar.

 

case não é uma estrutura. No é uma estrutura. A única no programa. E devia ter uma outra. case é uma cláusula. De um comando, o switch.

 

Não misture entrada e saída com a lógica. Fica muito mais difícil de testar e de mudar.

 

9 horas atrás, Carol Alves disse:

Tudo resolvido, não tá da forma mais inteligente do mundooo hahaha mas tá funcionando

 

Muito bom você ter voltado e postado o código! 👏🎖️

 

 

Link para o comentário
Compartilhar em outros sites

Em 17/09/2021 às 14:07, Carol Alves disse:

Tudo resolvido, não tá da forma mais inteligente do mundooo hahaha mas tá funcionando, obrigada pessoal!


Muito bom!
Mas se me permite, deixe-me lhe dar uma dica...
tava vendo seu fonte e percebi que tem um while a mais do que seria necessário no seu buscar. Não precisava.
Segue como ficou o meu abaixo. Eu não sei explicar porque o a minha função DeleteValueInNode não está deletando os nós repetidos. No meu entendimento era pra estar retirando todos de forma recursiva. Isso eu vou deixar pra você ou outro que quiser ajudar.
Desejo sucesso pra você nos seus estudos.

 



#include<stdio.h>
#include<stdlib.h>

typedef struct No
{
	int dado;
	struct No *next;
	struct No *before;
}No;

No *createNode(int val)
{
	No *newNode = malloc(sizeof(No));
	newNode->dado = val;
	newNode->next = NULL;
	newNode->before = NULL;
	return newNode;
}

No *insertInitNode(int num, No *Node)
{
	No *novo = malloc(sizeof(No));
	novo->before = NULL;
	novo->next=Node;
	novo->dado=num;
	return novo;
}

No *insertEndNode(int num, No *Node)
{
	No *aux = Node;
	No *novo;
	novo = malloc(sizeof(No));
	novo->dado=num; 
	novo->next=NULL;
	while(aux->next!=NULL)
	{
		aux=aux->next;
		if(aux->next==NULL)
		{
			novo->before=aux;
		}
	}
	aux->next=novo;
	return Node;
}

void findInNode(int busca, No *Node)
{
	int contador=1;
	No *aux;
	aux = Node;
	while (aux->next!=NULL && aux->dado!=busca) 
	{
		aux = aux->next;
		contador=contador+1;
	}
	if(aux->dado==busca)
	{
		printf("O valor procurado está na posição %d\n",contador);
	}
	else
	{
		printf("O valor procurado não foi encontrado\n");
	}
}

void findAllInNodes(int busca, No *Node)
{
	int contador=1;
	No *aux;
	aux = Node;
	while (aux->next!=NULL) 
	{
		aux = aux->next;
		contador=contador+1;
		if(aux->dado==busca)
		{
			printf("O valor procurado está na posição %d\n",contador);
		}
	}
}

No *EditValueNode(int target, int target2, No *Node)
{
	No *aux;
	aux = Node;
	while (aux->next!=NULL && aux->dado!=target) 
	{
		aux =  aux->next;
		if (aux!=NULL && aux->dado==target) 
		{
			aux->dado=target2;
		}
	}
	return Node;
}

No *EditNode(int target, int value, No *Node)
{
	int contador=1;
	No *aux;
	aux = Node;
	while (aux->next!=NULL && contador!=target) 
	{
		aux = aux->next;
		contador=contador+1;
	}
	if(contador==target)
	{
		aux->dado=value;
	}
	else
	{
		printf("No não encontrado\n");
	}
	return Node;
}

No *deleteValueInNode(int target, No *Node)
{
	No *aux;
	aux=Node;
	if(Node->dado==target)
	{
		if(Node->next!=NULL)
		{
			aux=Node->next;
			free(Node);
			Node->dado=aux->dado;
			Node->next=aux->next;
		}
		else
		{
			aux=Node->before;
			free(Node);
			Node->dado=aux->dado;
			Node->next=NULL;
		}
	}
	if(Node->next!=NULL)
	{
		deleteValueInNode(target, Node->next);
	}	
	return Node;
}

No *deleteAllNodes(No *Node)
{
	No *aux;
	aux=Node;
	while(aux->next!=NULL)
	{
		aux = Node->next;
		free(Node);
		Node=aux;
	}
	free(Node);
	Node=NULL;
	return Node;
}

void imprimir(No *Node)
{
	if(Node!=NULL)
	{
		if (Node->next!=NULL);
		{
			No *novo;
			novo=Node->next;
			imprimir(novo);
		}
		printf("Dado = %d\n",Node->dado);
	}
}

int main()
{
	printf("------------------------ createNode\n");
	No *node = createNode(3);
	imprimir(node);
	printf("------------------------ insertInitNode\n");

	node = insertInitNode(2, node);
	node = insertInitNode(2, node);
	node = insertInitNode(1, node);
	imprimir(node);
	printf("------------------------ insertEndNode\n");

	node = insertEndNode(4, node);
	imprimir(node);
	printf("------------------------ findInNode\n");

	findInNode(3, node);
	findInNode(6, node);
	printf("------------------------ findAllInNodes\n");

	findAllInNodes(2, node);
	printf("------------------------ EditValueNode\n");

	node = EditValueNode(2, 3, node);
	imprimir(node);
	printf("------------------------ EditNode\n");

	node = EditNode(4, 6, node);
	imprimir(node);
	printf("------------------------ deleteValueInNode\n");

	node = deleteValueInNode(3, node);
	imprimir(node);
	printf("------------------------ deleteAllNodes\n");

	node = deleteAllNodes(node);
	imprimir(node);
	printf("------------------------\n");

	return 0;
}


 

Link para o comentário
Compartilhar em outros sites

 

//criação da lista - recebe um inteiro e tem um ponteiro
//*ini é o ponteiro inicial (um ponteiro que aponta para outro ponteiro)

struct No {
    int dado;
    struct No* prox;
} *ini = NULL;

 

Sugiro MUITO que evite esse tipo de construção.

 

  • isso cria um único ponteiro para uma única struct global.
    • Isso é muito ruim de testar e manter. Não vai conseguir reaproveitar
    • evite esses comentários óbvios, e comente o que está fazendo e porque está fazendo. É bom para você e outros que venham a ler seu programa
    • evite acentos em comentários. Muitas vezes aparece tudo zoado na tela de outros
    • ENTENDA *ini não é sequer um ponteiro. *ini é uma struct No no seu caso.
    • já que está aprendendo evite esse vício de, ao declarar um ponteiro, colocar o asterisco junto do nome. Está declarando o nome. E o tipo INCLUI o asterisco. Isso confunde outros, tem efeitos colaterais, e gera confusão como a que você fez, escrevendo que *ini é um ponteiro, o que não é. o asterisco tem 3 usos em C. :( e essa é uma  das coisas que mostram que essa linguagem não foi escrita para ensinar a programar

Qual o tipo de ini?
 

	ini é struct No*, o que seu compilador
 poderia te dizer rapidamente.

 

O que é *ini?
 

	*ini é struct No

 

Trata-se da definição de C.

 

Declare como tal

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...