Почему вы печатаете ненужные символы?

У меня проблемы с печатью того, что я ввожу, поскольку оно всегда возвращает мне символы мусора.

Код состоит из создания двусвязного списка, в который можно вводить, искать и удалять элементы. Но проблема в том, что когда я хочу напечатать то, что я ввел, в нем отображаются только ненужные символы.

Стоит отметить, что я не практиковал много списков, так что это может быть небольшая ошибка или половина кода неверна.

Я сделал код, основанный на других упражнениях, которые я делал, но из простых списков. Я оставляю код:

#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;
}
2
задан 29.11.2019, 19:48
1 ответ

Первым, что называет ее 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Г - в улучшаемый в других аспектах, но с этими изменениями уже выполни Вашу цель

2
ответ дан 01.12.2019, 10:35

Теги

Похожие вопросы