У меня проблемы с печатью того, что я ввожу, поскольку оно всегда возвращает мне символы мусора.
Код состоит из создания двусвязного списка, в который можно вводить, искать и удалять элементы. Но проблема в том, что когда я хочу напечатать то, что я ввел, в нем отображаются только ненужные символы.
Стоит отметить, что я не практиковал много списков, так что это может быть небольшая ошибка или половина кода неверна.
Я сделал код, основанный на других упражнениях, которые я делал, но из простых списков. Я оставляю код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct datos{
char clases[30];
struct datos *sig;
struct datos *ant;
}doble;
doble *nuevo_nodo();
int InsertarInicio(doble **cab, char clases[]);
int InsertarFinal(doble **cab, char clases[]);
void ImprimirLista(doble *cab);
int EliminarNodo(doble **cab, char clases[]);
int main(int argc, char *argv[]) {
char clases[30];
doble *cab=NULL;
printf("Ingrese una clase: ");
scanf("%s",clases);
InsertarInicio(&cab,clases);
InsertarFinal(&cab,"hola");
ImprimirLista(cab);
return 0;
}
int InsertarFinal(doble **cab, char clases[])
{
doble *nuevo = NULL, *aux = *cab;
nuevo = nuevo_nodo(clases);
if (nuevo != NULL)
{
while(aux->sig != NULL){ aux = aux->sig;}
nuevo->ant = aux;
aux->sig = nuevo;
return 1;
}
return 0;
}
void ImprimirLista(doble *cab)
{
doble *aux = cab;
fflush(stdin);
while(aux != NULL)
{
printf("\n%s", aux->clases);
aux = aux->sig;
}
}
int InsertarInicio(doble **cab, char clases[])
{
doble *nuevo = NULL;
nuevo = nuevo_nodo(clases);
if (nuevo!=NULL)
{
nuevo->sig = *cab;
nuevo->ant = NULL;
if( *cab != NULL)
(*cab)->ant = nuevo;
*cab = nuevo;
return 1;
}
return 0;
}
doble *nuevo_nodo()
{
doble* nuevo = NULL;
nuevo = (doble*)malloc(sizeof(doble));
return nuevo;
}
Первым, что называет ее atenciГіn, является этот вызов:
int InsertarFinal(doble **cab, char clases[])
{
doble *nuevo = NULL, *aux = *cab;
nuevo = nuevo_nodo(clases); // <<--- ESTA
, Так как, если мы обслуживаем в нее declaraciГіn ее funciГіn, мы видим, что у нет аргументов :
doble *nuevo_nodo();
Ну, действительно это не хочет сказать, так как того, чтобы быть asГ - полученный habrГ-эксперт ошибка во времени compilaciГіn. В C, когда они не оставляют vacГ - вы их ему parГ©ntesis, значь, что funciГіn он может получать ее, один nГєmero произвольный parГЎmetros... не твой случай, так как я верю, что в тебя ты gustarГ, - по отношению к которому узел имел изначально цепь, которую только что ввел пользователь.
Она declaraciГіn deberГ, - чтобы оставаться asГ-:
doble *nuevo_nodo(char * const cadena);
и она implementaciГіn:
doble *nuevo_nodo(char * const cadena)
{
doble* nuevo = (doble*)calloc(1, sizeof(doble));
strcpy(nuevo->clases, cadena);
return nuevo;
}
Но просвет, оказывается, что у структуры doble
есть 3 переменные, которых два меткие ant
и sig
... ВїA, где они обозначаются? Куда угодно!!!
, Чтобы предотвращать испуг, договаривается incializar вышеупомянутые указатели. Ты можешь предпочитать делать это в руку:
nuevo = (doble*)malloc(sizeof(doble));
nuevo->sig = NULL;
nuevo->ant = NULL;
Или ты можешь использовать calloc
вместо malloc
, этой формы все байт из резерва инициализируются в 0 и решенную тему:
nuevo = (doble*)calloc(1, sizeof(doble));
Программа serГ - в улучшаемый в других аспектах, но с этими изменениями уже выполни Вашу цель