1
Dear friends, for example, I am using a list simply chained, without head and I need to write a function to delete an X element in the list. I made the following code:
#define Limite 21
typedef struct aluno{
char nome[Limite];
float nota;
struct aluno* ponteiro;
}t_aluno;
aluno* cria_aluno(){
aluno* novo = (aluno*)malloc(sizeof(aluno));
return novo;
}
\\Insere no inicio
aluno* inserir_aluno(aluno* Lista, char nome[], float nota){
aluno *novo_aluno = cria_aluno();
strcpy(novo_aluno->nome, nome);
novo_aluno->nota = nota;
if(Lista == NULL){
Lista = novo_aluno;
novo_aluno->ponteiro = NULL;
}else{
novo_aluno->ponteiro = Lista;
Lista = novo_aluno;
}
return Lista;
}
void excluir(aluno *Lista, aluno *anterior){
aluno* lixo;
if(anterior != NULL){
lixo = anterior->ponteiro;
}else{
lixo = Lista;
}
if(lixo == Lista && lixo->ponteiro == NULL){
Lista = NULL;
}else if(lixo == Lista && lixo->ponteiro != NULL){
aluno *prox = lixo->ponteiro;
printf("%s", prox->nome);
Lista = lixo->ponteiro;
}else{
anterior->ponteiro = lixo->ponteiro;
}
free(lixo);
}
aluno *indexPrev(aluno *Lista, char nome[]){
if(Lista != NULL){
aluno *i = Lista;
aluno *prox = NULL;
if(strcmp(nome, i->nome) == 0){
i = NULL;
return i;
}
while(i != NULL){
prox = i->ponteiro;
if (strcmp(nome, prox->nome) == 0){
return i;
}
i = i->ponteiro;
}
}else{
printf("Lista vazia \n");
}
}
int main() {
int total = 0;
int v = 0;
char nome_aluno[Limite];
float nota = 0;
t_aluno *Lista = NULL;
while (v != 6){
printf(" \n -------------------------------- \n ESCOLA \n -------------------------------- \n 1 - Cadastrar aluno \n 2 - Ver todos os alunos \n 3 - Ver relacao aprovados x reprovados \n 4 - \n 5 - Excluir aluno \n 6 - Sair \n -------------------------------- \n");
scanf("%d", &v);
switch (v) {
case 1:
printf(" Insira o nome do aluno: ");
scanf("%s", &nome_aluno);
printf(" Insira a nota: ");
scanf("%f", ¬a);
Lista = inserir_aluno(Lista, nome_aluno, nota);
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
char *n;
printf("Informe o nome do aluno: \n");
scanf("%s", nome_aluno);
//aluno *index = indexOf(Lista, nome_aluno);
aluno *anterior = indexPrev(Lista, nome_aluno);
excluir(Lista, anterior);
break;
}
}
}
The "delete" function excludes the element if it is in the middle or at the end of the list. But when it is in the first position, the element is not excluded and the print the list, it returns me a data totally messed up, as the image below:
Kindly, I’d like to know where I’m going wrong and what brings this one back " rubbish "?
Edit your question and post the input code and the list creation code as well. Your example should be reproducible by anyone who wants to help you. Hug!!
– lmonferrari