2
Hello, I have an error in the function that prints a chained list.
I think the error is in the print function’s for, but I may also be saving the address of prox
wrongly.
Follows the code:
/*
* File: main.c
* Author: pmargreff
*
* Created on 1 de Dezembro de 2014, 20:17
*/
/*
* cria um struct que contém um nodo do tipo inteiro
* e um ponteiro para uma celula do tipo do próprio struct
*/
struct cel {
int nodo;
struct cel *prox;
};
typedef struct cel celula;
#include <stdio.h>
#include <stdlib.h>
celula *cria(void); //por que a função é um ponteiro ?
void insere(int x, celula *pont);
void imprime(celula *inicio);
/*
*
*/
int main(int argc, char** argv) {
int i;
celula *inicio;
inicio = cria();
for (i = 0; i < 10; i++) {
insere(i, inicio);
}
imprime(inicio);
return (EXIT_SUCCESS);
}
/*
* cria uma função que recebe uma célula apontando para o ínicio
* e que aloca espaço para um tipo célula e passa a ser apontada pela
* célula inicio
*/
celula *cria(void) {
celula *primeira;
primeira = malloc(sizeof (struct cel));
primeira->prox = NULL;
return primeira; //perguntar para o andŕe o que isso significa
}
/*
* cria uma nova váriavel do tipo célula chamada de "nova"
* aloca espaço para ela, insere o valor no campo do seu conteúdo
* o ponteiro da célula (ou seja) prox, recebe o valor que o ponteiro
* da célula anterior a ela tinha, o ponteiro da primeira aponta para
* nova
*/
void insere(int x, celula *head) {
celula *nova;
nova = malloc(sizeof (struct cel));
nova -> nodo = x;
nova -> prox = head -> prox;
head -> prox = head;
}
void imprime(celula *inicio){
celula *pont;
for (pont = inicio -> prox; pont != NULL; pont = pont->prox)
printf (" %d\n", pont->nodo);
}
After a few more attempts, I have a new function used for insertion.
void *insere(int x, celula *head) {
celula *nova;
nova = malloc(sizeof (struct cel));
nova -> nodo = x;
nova -> prox = head -> prox;
head -> prox = nova;
}
Hello, I changed the function inserts to one as you left the suggestion, but I return nothing. What is the practical difference of implementing how I did to do as you exemplified by returning a pointer to a new cell ? Thanks for the helpability ...
– pmargreff
Its new function is wrong, because if it receives a list [A, B, C], it changes the pointers making it [A, N, B, C], where N is the new cell. That is, it always enters in the second position. If it receives an empty list, it will crash. In the function I suggested, to enter at the beginning, you will have to return the created node, which is the new beginning, the new head of the list. Otherwise you would not be able to find the new beginning of the list. It is important you put
inicio = insere_no_inicio(i, inicio);
. I will update the text to make this clear.– Victor Stafusa
@pmargreff I edited the answer. See what you think.
– Victor Stafusa
Now I understand my mistake, !
– pmargreff