Как использовать структуры, укрытые с указателями C?

У меня есть этот центральный блок

struct materias
{
    char nombre[30];
    char profesor[30];
    char tipoDeMateria[20];
    char horasSemanales[10];
    struct actividades *actividad;
    struct fechasEspeciales *fechas;
    struct materias *siguiente;
};

и эта другая структура

struct fechasEspeciales
{
    char tipo[30];
    int dia;
    int mes;
    char horaDeIncio[8];
    char horaDeFin[8];
    struct fechasEspeciales *siguiente;
};  

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

3
задан 24.11.2016, 13:42
2 ответа

Я предполагаю, что материя может хранить список дат.

Я игнорирую функции, которые ты осуществил, чтобы управлять о структурах. Мне приходит в голову этот выбор, но это не означает, что это была единственная:

// Esta función añade un nuevo elemento a la lista
// Si la lista está vacía (puntero nulo), el nuevo elemento pasa a ser el primero de la lista
// El nuevo elemento será accesible via el puntero doble nuevoElemento
struct fechasEspeciales* NuevoElemento(
  struct fechasEspeciales* inicioLista,
  struct fechasEspeciales** nuevoElemento)
{
  *nuevoElemento = (struct fechasEspeciales*)calloc(1,sizeof(struct fechasEspeciales));

  if( inicioLista == 0 )
  {
    inicioLista = *nuevoElemento;
  }
  else
  {
    struct fechasEspeciales* ptr = inicioLista;
    while( ptr->siguiente )
      ptr = ptr->siguiente;

    ptr->siguiente = *nuevoElemento;
  }

  return inicioLista;
}

struct materias materia;
materias.fecha = 0; // inicialización

// Añadir 3 fechas
for( int i=0; i<3; i++ )
{
  struct fechasEspeciales* nuevaFecha;
  materia.fechas = NuevoElemento(materias.fecha,&nuevaFecha);
  nuevaFecha->dia = 10+i; // Para simular el cambio de dia
  nuevaFecha->mes = 11;
// ...
}

После цикла, в materia.fechas ты найдешь список с тремя элементами, что мы можем подтверждать с функцией, чтобы печатать список:

void ImprimirFechas(struct fechasEspeciales* lista)
{
  while( lista )
  {
    printf("Fecha: %d/%d\n",lista->dia,lista->mes);
    lista = lista->siguiente;
  }
}

ImprimirFechas(materia.fechas);
1
ответ дан 24.11.2019, 12:26

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

В договорной структуре используется оператор . давайте предполагать следующий пример:

struct materias
{
    char nombre[30];
    char profesor[30];
    char tipoDeMateria[20];
    char horasSemanales[10];
};

, Чтобы писать поле nombre, podrГ-схвати делать следующее:

struct materias mi_variable;
strcpy(mi_variable.nombre,"ilfredo"); // Porque nombre es un char* y no puedes escribirlo como una variable convencional

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

struct materias
{
    char nombre[30];
    char profesor[30];
    char tipoDeMateria[20];
    char horasSemanales[10];
};

, Чтобы писать поле nombre, podrГ-схвати делать следующее:

struct materias * mi_puntero;
strcpy(mi_puntero->nombre,"ilfredo");

Оператор -> используется, когда ты работаешь с указателем в структуру. Он полностью эквивалентный, чтобы использовать операторов * и . одновременно. Это проистекает того, что первый deberГ-эксперт использовать * для desreferenciar структура и потом ., чтобы соглашаться на поле, которое интересует тебя в особенности

, мы Сейчас предполагаем следующий пример:

struct materias
{
    char nombre[30];
    char profesor[30];
    char tipoDeMateria[20];
    char horasSemanales[10];
    struct fechasEspeciales fechas; // Modifiqué esta estructura para que se entienda mejor la explicacion (Eliminé el puntero)
};

struct fechasEspeciales
{
    char tipo[30];
    int dia;
    int mes;
    char horaDeIncio[8];
    char horaDeFin[8];
    struct fechasEspeciales *siguiente;
};  

В этом случае, чтобы писать поле dia, deberГ-схвати делать следующее:

struct materias mi_variable;
mi_variable.fechas.dia=24; // Para escribir una estructura dentro de otra, se usa el operador `.` una vez por cada estructura.

И сейчас, если мы прибываем в случай, который ты выдвинул, что он объединяет все предыдущие примеры в единственном случае:

struct materias
{
    char nombre[30];
    char profesor[30];
    char tipoDeMateria[20];
    char horasSemanales[10];
    struct actividades *actividad;
    struct fechasEspeciales *fechas;
    struct materias *siguiente;
};

struct fechasEspeciales
{
    char tipo[30];
    int dia;
    int mes;
    char horaDeIncio[8];
    char horaDeFin[8];
    struct fechasEspeciales *siguiente;
}; 

Сейчас у тебя нет структуры внутри другой, но у тебя есть структура, которая содержит указатель в другую структуру, и чтобы писать поле dia, deberГ-схвати делать следующее:

 struct materias mi_variable;
 (mi_variable.fechas)->dia=24;

Надеялся, что он твоей помощи, привет!

0
ответ дан 24.11.2019, 12:26
  • 1
    Используйте, как ты сказал мне (registroNuevo.fechas)-> дни = 24; но он дает мне ошибку, так как ты датируешь, является суфлером –  ilfredo 24.11.2016, 22:51
  • 2
    Именно как даты это указатель, не deberí схвати иметь проблему используя оператор ->, ты уверен, что estas используя в правильной форме? Я предлагаю тебе postear блок có я говорю, что ты используешь –  cventu 24.11.2016, 22:54
  • 3
    Он говорит мне, что ошибка está он в '.' не в '-> ' (registroNuevo.fechas)-> тип ошибка это дает внутри paré ntesis где está '.' –  ilfredo 24.11.2016, 23:37
  • 4
    Тогда конечно будьте, потому что registroNuevo не структура, как сказал ты, но это указатель в структуру. В этом случае tendrá s, который использовать (registroNuevo-> ты датируешь)-> dí в –  cventu 25.11.2016, 00:30

Теги

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