Добавление элемента в структуру, которая содержит указатель на символ - PullRequest
0 голосов
/ 22 сентября 2018

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

struct GraphicElement {
    char* fileName;
    struct GraphicElement* pNext;
  };
    struct RasterGraphic {
    struct GraphicElement* GraphicElements;
  };

ЗатемЯ вызываю функцию, которая заботится о инициализации, которая, по моему мнению, работает правильно.

int main(void)
{
char response;
BOOL RUNNING = TRUE;
struct RasterGraphic RG;
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
InitRasterGraphic(&RG);

Функция инициализации выглядит следующим образом

void InitRasterGraphic(struct RasterGraphic* pA)
{

pA->GraphicElements = malloc(sizeof(struct GraphicElement));

if (pA->GraphicElements == NULL) return;
//pA->GraphicElements = 0;
//pA->GraphicElements->pNext = NULL;
//pA->GraphicElements->fileName = NULL;
pA->GraphicElements->fileName = (char*)malloc(sizeof(char));

return;
}

Так что следующая часть кода - это где яЯ собираюсь задать свой вопрос.У меня есть функция, которая принимает пользовательский ввод какой-то строки.Я хотел бы взять этот вход и добавить его к следующему элементу.Поэтому каждый раз, когда пользователь вызывает функцию, которую он вводит в свой ввод, она добавляется к следующему элементу.Мой код сейчас беспорядок, и я знаю, что он, вероятно, далеко, я уже пробовал кучу вещей.Я считаю, что мне нужно использовать realloc.То, что я не могу обернуть здесь, это то, как взять ввод и добавить его, чтобы позже я мог распечатать все элементы по порядку.так, например, пользователь вызывает функцию 3 раза и вводит в нее «привет» «мир».Позже я хотел бы перебрать и распечатать графическое изображение 1 "привет", графическое изображение 2 - это "мир"

void InsertGraphicElement(struct RasterGraphic* pA)
{
char response[256];
printf("Insert a GraphicElement in the RasterGraphic\nPlease enter the GraphicElement filename: ");
scanf("%s", &response[0]);
pA->GraphicElements->fileName = realloc(pA->GraphicElements, 256*sizeof(char));
pA->GraphicElements++;
strcpy(pA->GraphicElements->fileName, &response);
if (pA->GraphicElements == 1){

    printf("\nThis is the first GraphicElement in the list\n");
    }

return;
}

1 Ответ

0 голосов
/ 22 сентября 2018

Вот несколько проблем в вашем коде.

  1. Я считаю, что InitRasterGraphic должен просто инициализировать pA->GraphicElements = NULL вместо malloc его.Так как то же самое должно быть обработано в функции InsertGraphicElement.

  2. pA->GraphicElements->fileName = (char*)malloc(sizeof(char));, это просто выделит memory одного размера char, и нет никакого смысла в alloc ingи realloc ing.

  3. scanf("%s", &response[0]); должно быть scanf("%s", &response[0]);.

  4. pA->GraphicElements++; Это неправильно вместо использования еще одного членачтобы сохранить количество узлов в списке.

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

ваш RasterGraphic будет выглядеть ниже.

struct RasterGraphic {
    int numNodes;
    struct GraphicElement* GraphicElements;
  };

Ваш InitRasterGraphic будет выглядеть ниже.

void InitRasterGraphic(struct RasterGraphic* pA)
{

    pA->GraphicElements = NULL;
    pA->numNodes = 0;

   return;
}

Ваш InsertGraphicElement будет выглядеть ниже.

void InsertGraphicElement(struct RasterGraphic* pA)
{
   struct GraphicElement *newNode = malloc(sizeof(*newNode));
   if (newNode == NULL) return;

   newNode->fileName = malloc(256*sizeof(char));
   if (newNode->fileName == NULL) return;
   newNode->pNext = NULL;


   printf("Insert a GraphicElement in the RasterGraphic\nPlease enter the GraphicElement filename: ");
   scanf("%s", newNode->fileName);


   if (pA->GraphicElements == NULL)
   {
      pA->GraphicElements = newNode;
   }
   else
   {
      struct GraphicElement *tempHead = pA->GraphicElements;
      while(tempHead->pNext != NULL)
      {
         tempHead = tempHead->pNext;
      }
      tempHead->pNext = newNode;
   }

   pA->numNodes++;
   if (pA->numNodes == 1){
      printf("\nThis is the first GraphicElement in the list\n");
   }

  return;
}
...