Ir ao conteúdo
  • Cadastre-se

C Inserindo valor em determinada posição da lista encadeada. Linguagem C.


jcgs98
Ir à solução Resolvido por jcgs98,

Posts recomendados

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

typedef struct No
{
	int valor		;
	struct No *prox	;
}	TNo				;

typedef TNo* TLista	;


int insereNaPosicao (TLista *L,int inserido,int posicao)
	{
		int con=0,CON=0;
		
		TLista AUX, aux, novo, tam;
		
		AUX=*L;	tam=*L;
		
		posicao=posicao-1;
		
		novo=(TLista) malloc (sizeof(TNo));
		
        novo->valor = inserido;
		
		while (tam!=NULL)
        {
            tam=tam->prox;
            
            CON++;
        }
        
        if (posicao>CON||posicao<0)
        {
        	return 0;
		}
        
        while (con<posicao-1)
        {
            AUX=AUX->prox;
            
			con++;
        }
        
		aux=AUX->prox;
        
		AUX->prox=novo;
        
		novo->prox=aux;        
        
		return 1;
	}

 

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

@Comunista.RJ     seu código não está funcionando ,  ele apresenta esse erro , aqui :

undefined reference to 'WinMain@16'

não sei como resolver ,   se você puder postar uma solução agradeço muito , obrigado !

e por favor veja se essa Lista está certa desse modo :

#include <stdio.h>
#include <stdlib.h>
void listar(struct endereco *memoria);
struct endereco
{
    int dados;
    struct endereco *ponteiro;
};
typedef struct endereco endereco;
int main()
{
    endereco *pNode1 = NULL;
    endereco *pNode2 = NULL;
    endereco *pNode3 = NULL;
    pNode1 = (struct endereco*) malloc(sizeof(struct endereco*));
    pNode1-> dados = 10;
    pNode2 = (struct endereco*) malloc(sizeof(struct endereco*));
    pNode2-> dados = 20;
    pNode3 = (struct endereco*) malloc(sizeof(struct endereco*));
    pNode3-> dados = 30;
    pNode1-> ponteiro = pNode2;
    pNode2-> ponteiro = pNode3;
    pNode3-> ponteiro = NULL;
    if(pNode1)
        listar(pNode1);
    free(pNode1);
    free(pNode2);
    free(pNode3);
    return 32768;
}
void listar( struct endereco *memoria )
{
    printf("Mostrando a lista:\n");
    if( memoria != 0 )                           // se p diferente de Zero
    {
        do
        {
            printf(" %d", memoria -> dados );
            memoria = memoria -> ponteiro;
        }while( memoria != 0 );
    }
    else
        printf("Lista vazia.");
}

copiei da internet , mas não sei se esse seria um modo correto para se fazer listas encadeadas .

Link para o comentário
Compartilhar em outros sites

@devair1010  Fiz algumas modificações e executou sem erro,

 

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

struct endereco
{
    int dados;
    struct endereco *ponteiro;
};

typedef struct endereco Endereco;

void listar(Endereco *memoria);
int main()
{
    Endereco *pNode1 = NULL;
    Endereco *pNode2 = NULL;
    Endereco *pNode3 = NULL;
    pNode1 = (Endereco *) malloc(sizeof(Endereco));
    pNode1-> dados = 10;
    pNode2 = (Endereco *) malloc(sizeof(Endereco));
    pNode2-> dados = 20;
    pNode3 = (Endereco *) malloc(sizeof(Endereco));
    pNode3-> dados = 30;
    pNode1-> ponteiro = pNode2;
    pNode2-> ponteiro = pNode3;
    pNode3-> ponteiro = NULL;
    if(pNode1)
        listar(pNode1);
    free(pNode1);
    free(pNode2);
    free(pNode3);
    return 32768;
}
void listar(Endereco *memoria )
{
    printf("Mostrando a lista:\n");
    if( memoria != 0 )                           // se p diferente de Zero
    {
        do
        {
            printf(" %d", memoria -> dados );
            memoria = memoria -> ponteiro;
        }while( memoria != 0 );
    }
    else
        printf("Lista vazia.");
}

 

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

15 horas atrás, devair1010 disse:

copiei da internet , mas não sei se esse seria um modo correto para se fazer listas encadeadas

 

Não, não é.

 

15 horas atrás, devair1010 disse:

não sei como resolver ,   se você puder postar uma solução agradeço muito , obrigado !

e por favor veja se essa Lista está certa desse modo

 

Sobre o código original postado no tópico

 

Compilei o código original com o Visual Studio Code em Linux e não deu erro.

 


É só um trecho de código e pouco útil como tal. Em geral quando se quer postar algo útil, ou na expectativa de que seja útil, como o caso desse fragmento, se deve postar um programa compilável. Inteiro. E um exemplo de saída. E dados de entrada quando for o caso. E quem sabe o ambiente onde foi compilado. Windows? Linux? Máquina de lavar? 

 

Assim quem tiver interesse pode progredir rapidamente com o código apresentado, tentar rodar em sua máquina já sabendo o que deve sair. E com o que alimentar o programa quando for o caso.

 

Em Windows evite chamar variáveis ou arquivos de CON, AUX, e PRT... São nomes reservados, do tempo em que a conio.h era moderna. Pode dar problema em muitas situações. E nada acrescenta. Evite nomes de variáveis em maiúsculas. Todo o mundo espera que sejam constantes. É uma convenção, mas uma convenção útil.

 

Uma vez atendi uma empresa com dificuldade em portar um sistema do Unix para Windows porque um dos muitos arquivos do sistema era chamado AUX e criado automaticamente com umas tabelas temporárias de implantação :D e ninguém da empresa sabia que não podia ter um arquivo com esse nome gerado na instalação

 

Sobre o código no post  #2 postado por @devair1010

 

Isso:

 

struct endereco
{
    int dados;
    struct endereco *ponteiro;
};

 

não é nada útil.


Ao programar uma lista ligada, ou qualquer outra estrutura desse tipo, entenda que elas são containers. Na verdade são até chamadas assim em C++. Ou coleções em java.

 

Uma lista é uma lista. Ela tem nós. Os nós tem dados. E a vida segue.

 

Toda vez que você programar uma estrutura dessas como se o nó ou o dado fosse a estrutura vai perder muito tempo e não vai conseguir um bom resultado. 

 

De volta à lista ligada:
 

  • uma lista ligada não é um nó. Um nó não é uma lista.
  • é muito mais fácil programar uma lista ligada com ponteiros para os dois lados. Se usar um só tudo que for fazer vai ficar mais difícil porque tem que voltar toda hora pro início da lista e começar de novo.
  • não por acaso os problemas clássicos de lista ligada são os de playlist de música, coleção de filmes, estantes de livros, e  a fila do consultório.


Escreva em torno dos dados. Sempre.

 

O que se espera de uma lista ligada?
 

  • quantos elementos tem?
  • está vazia?
  • insere algo no começo
  • lista
  • exclui algo
  • insere algo no fim


Percebe que nada disso tem a ver com o que tem dentro da lista?


Sobre o título do tópico

 

Inserindo valor em determinada posição da lista encadeada. Linguagem C

 

Note que isso é pouco útil. É até um exercício comum, só pelos conceitos. Mas é inútil.

Se é importante ter esse recurso uma lista ligada seria uma escolha medíocre. Um array seria dezenas de vezes mais efetivo. 

O que se quer em uma lista ligada é inserir NA ORDEM. Qual ordem? Qualquer ordem:

  • No caso dos livros? Título? ISBN?
  • No caso de um cadastro? CPF? RG? Nome?
  • No caso de uma lista de cargas? CEP de destino? Placa do caminhão que vai transportar? Código do cliente?


Perceba que aí sim o conteúdo da lista é importante.

 

Uma estrutura alternativa para um nó:

 

struct no
{
    void*      item;
    struct no* proxima;
    struct no* anterior;
};  // no
typedef struct no Node;

 

Entenda que o nó tem um item, que é só um ponteiro. Para que? Porque assim a lista arrasta qualquer coisa dentro. De um int a um vetor de outras listas. E vai funcionar. Sempre. Isso quer dizer que você nunca mais vai programar isso a menos que ache um erro ou precise de algo novo.

 

Não vai nem compilar isso mais, porque vai guardar compilado, como uma biblioteca. E só vai usar o arquivo .h. É assim que se vende isso: o header e a biblioteca ou a DLL.

 

E o que tem na lista? Node. Nada mais.

 

Mas e a lista? Pode ser algo simples assim:
 

struct a_propria_lista
{
    char*     nome;
    unsigned  quantos;
    unsigned  maximo;
    Node*     inicio;
    Node*     fim;
};
typedef struct a_propria_lista Lista;

 

Note que a lista tem um Node no início, um Node no fim, uma certa quantia de nós, um limite e até um nominho. Nada sobre dados. Isso é o que importa. Se chama encapsulamento. A Lista tem Nodes, os Node tem dados.

 

 

 

 

 

 

 

 

 

 

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

@arfneto    obrigado  ,   desculpe  , ainda nunca tinha estudado nada referente a Listas Ligadas ,  mas esse código que  o  @Comunista.RJ    postou não compila , ele diz que não tem a função main nesse código ,   e  colocando a função main  , está compilando ,  assim  :

#include <stdio.h>
#include <stdlib.h>
typedef struct No
{
    int valor       ;
    struct No *prox ;
}T No               ;
typedef TNo  *TLista;
int insereNaPosicao (TLista *L,int inserido,int posicao);
int main()
{
    int inserido=5, posicao=1;
    TLista  *L;
    insereNaPosicao ( L, inserido, posicao);
    return 8;
}
int insereNaPosicao (TLista *L,int inserido,int posicao)
{
    int con=0,CON=0;
    TLista AUX, aux, novo, tam;
    AUX=*L;	tam=*L;
    posicao=posicao-1;
    novo=(TLista) malloc (sizeof(TNo));
    novo->valor = inserido;
    while (tam!=NULL)
    {
        tam=tam->prox;
        CON++;
    }
    if (posicao>CON||posicao<0)
    {
        return 0;
    }
    while (con<posicao-1)
    {
        AUX=AUX->prox;
        con++;
    }
    aux=AUX->prox;
    AUX->prox=novo;
    novo->prox=aux;
    return 1;
}

 queria fazer um jogo da velha usando essas listas encadeadas , será que seria útil para essa finalidade , ou se tornaria muito complicado .

 

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

32 minutos atrás, devair1010 disse:

postou não compila , ele diz que não tem a função main nesse código ,   e  colocando a função main  , está compilando ,  assim

 

Claro que não tem a função main(). Aparentemente o autor só queria mostrar essa função: 
 

    int insereNaPosicao (TLista *L, int inserido, int posicao);

 

Você leu o que eu expliquei? Acha que entendeu? 

 

  • Esse não é um bom trecho de programa. Não adianta nada tentar arrumar.
     
  • Conceitualmente já está errado: se a lista estiver vazia precisa mudar o ponteiro de início. Como passou o ponteiro para a função e não retornou nada ele vai morrer lá dentro.
     
  • Em uma lista ligada inserir na posição é raramente útil. Como eu disse, ou você insere no fim, no começo ou em alguma ordem. Em geral na ordem. Por exemplo insere músicas pela ordem da faixa em um album. Insere livros pelo código ISBN numa coleção. Nunca quer inserir o livro na posição 3. Mesmo se fosse inserir a terceira música numa lista de músicas de um album, ia inserir pela posição da faixa. Entenda a diferença: você pode inserir as faixas em qualquer ordem, por exemplo. Elas acabam ordenadas porque a faixa é um campo do registro e não a posição física na lista. No caso de uma playlist até poderia fazer sentido entrar com a quinta faixa, mas a lógica é que mesmo assim o que se quer é escolher a música que toda antes ou depois de uma outra. Não a ordem objetiva.
  • Imagine que tem um cadastro, nome, CPF e RG. E tem uma lista desses caras. Você quer uma lista ligada com as pessoas. Mil pessoas, 3 pessoas, 30.000 pessoas. Não ia preferir inserir por ordem de RG ou CPF ou nome? Para que ia querer inserir o décimo cara se a posição é irrelevante? Se fosse uma fila ia inserir na ordem, mas de prioridade. Se todo mundo tem a mesma prioridade ia inserir como? Por ordem de chegada, a popular fila: quem chega vai pro fim da fila. Assim é. Listas resolvem problemas desse tipo. Mas ninguém chega para ser o N-ésimo cara da fila. Para que uma função que insere na posição N? Essa é a função que você quer, quase sempre:
     
        int		_inserir_na_ordem(void*, Lista*, int(*)(void*, void*));


    E porque? Simples. Imagine o exemplo do cadastro:
     

    typedef struct um
    {
        char* nome;
        char  RG [14];
        char  CPF[16];
    
    }   Cadastro;

Em geral se escolhe uma ordem para facilitar a busca depois, então vai por exemplo inserir por ordem de CPF. É difícil achar uma razão para querer inserir na posição 5 :) e aí vai gostar de poder escrever
 

    Lista teste = criar("Uma lista de pessoas");	
    Cadastro um_cara = le_um();	
    teste = _inserir_na_ordem( (void*)&um_cara, teste, compara_pessoas);


e saber que ao listar os caras vão aparecer por ordem de CPF e pode pesquisar nessa ordem para não duplicar ninguém.

 

32 minutos atrás, devair1010 disse:

queria fazer um jogo da velha usando essas listas encadeadas

 

Não consigo imaginar como uma lista ligada seria útil para isso. O que teria nos Nodes da lista? O jogo é só um mapa de células e um contexto. O que iria fazer com os nós da lista?

 

 

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

  • Solução

@devair1010 Conitnue fazendo do meu jeito; é mais didático.
As pessoas esquecem que vocês vem aqui para aprender.
Sempre me irritei com algumas respostas que nada ajudam quem vem aqui pedir auxílio.
Isso tudo acabou com minha chegada.
Mesmo que digam que o post é inútil (se ensina é bem útil).
Vou ver seu problema e tentar te explicar.

@devair1010
"ele diz que não tem a função main nesse código"
Sim, não tem: é "só" uma função.

Vou postar com a main para fins didáticos.

Em 09/11/2020 às 21:27, devair1010 disse:

@arfneto    obrigado  ,   desculpe  , ainda nunca tinha estudado nada referente a Listas Ligadas ,  mas esse código que  o  @Comunista.RJ    postou não compila , ele diz que não tem a função main nesse código ,   e  colocando a função main  , está compilando ,  assim  :


#include <stdio.h>
#include <stdlib.h>
typedef struct No
{
    int valor       ;
    struct No *prox ;
}T No               ;
typedef TNo  *TLista;
int insereNaPosicao (TLista *L,int inserido,int posicao);
int main()
{
    int inserido=5, posicao=1;
    TLista  *L;
    insereNaPosicao ( L, inserido, posicao);
    return 8;
}
int insereNaPosicao (TLista *L,int inserido,int posicao)
{
    int con=0,CON=0;
    TLista AUX, aux, novo, tam;
    AUX=*L;	tam=*L;
    posicao=posicao-1;
    novo=(TLista) malloc (sizeof(TNo));
    novo->valor = inserido;
    while (tam!=NULL)
    {
        tam=tam->prox;
        CON++;
    }
    if (posicao>CON||posicao<0)
    {
        return 0;
    }
    while (con<posicao-1)
    {
        AUX=AUX->prox;
        con++;
    }
    aux=AUX->prox;
    AUX->prox=novo;
    novo->prox=aux;
    return 1;
}

 queria fazer um jogo da velha usando essas listas encadeadas , será que seria útil para essa finalidade , ou se tornaria muito complicado .

 

Primeiro você deve construir a estrutura que vai criar os nós:
//ESTRUTRA DO NÓ

typedef struct No {

int valor;

struct No *prox;

}TNo;

 

//SERVER PARA VOCÊ NÃO TER QUE FAZER PONTEIRO DE PONTEIRO (**) E SE CONFUNDIR

typedef TNo* TLista;
 

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

typedef struct No {
	int valor;
	struct No *prox;
} TNo;

typedef TNo* TLista;

int insereNaPosicao (TLista *Lista,int inserido,int posicao);

int colocarElementosNaLista (TLista *Lista, int elemento);

void exibirElementosDaLista (TLista Lista);

int main (void)
	{
		TLista Lista = NULL;
	
		int opcao, num1, num2;
		
		setlocale(LC_ALL,"");
	
		do
		{
			system ("cls");
			printf ("Opções:\n\n");
			printf ("(1)\tInserir na Lista\n(2)\tInserir Em Determinada Posição\n");
			printf ("(3)\tExibir Lista Criada\n(4)\tSair\n\n");
			printf ("Entre com a sua opção: ");	scanf ("%d", &op);
			
			switch (op)
			{
				case 1: printf ("Entre com o número a ser inserido: ");	scanf ("%d", &num1);
	
						if (colocarElementosNaLista (&Lista, num1))
				        {
				        	printf ("Elemento inserido!\n");
						}
						else
						{
							printf ("ERRO: Elemento não inserido!\n");
						}	break;
	
				case 2: printf ("Entre com o número a ser inserido: ");	scanf ("%d", &num1);
				        
				        printf ("Entre com o posição: ");	scanf ("%d", &num2);
				        
				        if (insereNaPosicao (&Lista,num1, num2))
				        {
				        	printf ("Elemento %i inserido na %ia. posição da lista!\n",num1,num2);
						}
						else
						{
							printf ("ERRO: Elemento não inserido na lista!\n");
						}	break;
							
				case 3: exibirElementosDaLista (Lista);	break;
					
				case 4: printf ("Fim do programa!\n");	break;
				        
				default: printf ("Opção inválida! Tente novamente.\n");
			}	system ("pause");
			
		}	while (opcao != 4);
	}

int insereNaPosicao (TLista *Lista,int inserido,int posicao)
	{
		int con=0,CON=0;
		
		TLista AUX, aux, novo, tam;
		
		AUX=*Lista;	tam=*Lista;
		
		posicao=posicao-1;
		
		novo=(TLista) malloc (sizeof(TNo));
		
        novo->valor = inserido;
		
		while (tam!=NULL)
        {
            tam=tam->prox;	CON++;
        }
        
        if (posicao>CON||posicao<0)
        {
        	return 0;
		}
        
        while (con<posicao-1)
        {
            AUX=AUX->prox;	con++;
        }
        
		aux=AUX->prox;
        
		AUX->prox=novo;
        
		novo->prox=aux;        
        
		return 1;
	}

int colocarElementosNaLista (TLista *Lista, int numero)
{
	TLista aux = (TLista) malloc (sizeof(TNo));
	
	if (!aux) //(aux == NULL)
	{
		return 0;
	}
	else
	{
		aux->valor = numero;

		aux->prox = *Lista;

		*Lista = aux;
		
		return 1;
	}
}


void exibirElementosDaLista (TLista Lista)
{

	TLista i;

	if (!Lista)//if (Lista == NULL)
	{
		printf ("Lista vazia!\n");
	}
	else
	{
		printf ("Elementos: ");
	
		i = Lista;
	
		while (i) //while (i != NULL)
		{

			printf ("%d ", i->valor);
			
			i = i->prox;
		}
		
		printf ("\n");
	}
}

@devair1010 código completo

  • Curtir 1
  • Obrigado 1
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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!