Как использовать malloc для вставки узла в связанный список? - PullRequest
1 голос
/ 01 декабря 2011

Я пишу программу, которая вызывает функцию main, которая создает узел для построения связанного списка. Программа читает символы из файла для размещения в узлах. Программа работает нормально, пока не попадет в функцию, создающую узлы. Я не уверен, есть ли логическая или синтаксическая ошибка или что-то еще. Извините за длину, но ошибки не далеко от начала. Кроме того, дайте мне знать, если вы хотите, чтобы мой заголовочный файл. Код взят из моей книги на C: «Компьютерные науки: подход структурированного программирования с использованием C», третье издание. Любая помощь (и объяснение моих ошибок) будет принята с благодарностью!

Спасибо!

Вот main.c:

#include "my.h"

int main (int argc, char* argv[])
{
     int y;
     NODE* pList;
     NODE* pPre;
     NODE* pNew;
     DATA item;
     FILE* fpntr;
     int closeResult;

     pList = NULL;         

     fpntr = fopen(argv[1], "r");                            // open file 
        if(!fpntr)
            {
                 printf("Could not open input file.\n");
                 exit (101);
            }
        else printf("The file opened.\n");


printf("starting InNode.\n");                                 //testing to see if this is working

    while((y = fscanf(fpntr, "%c", &(item.key))) != EOF)
           pList = InNode(pList, pPre, item);

printf("end InNode.\n");                                      //testing to see if this is working, doesn't get this far

printf("starting printme.\n");


    printme(pList);


printf("end printme.\n");

     closeResult = fclose(fpntr);                             //close file 
        if(closeResult == EOF)
            {
                 printf("Could not close input file.\n");
                 exit (102);
            }
        else printf("The file closed.\n");

     free(a);
     return 0;
}

Вот InNode.c (прямо из моей книги):

#include "my.h"

NODE* InNode (NODE* pList, NODE* pPre, DATA item)

{
    NODE* pNew;

printf("start malloc.\n");                                   //testing to see if this is working

    if (!(pNew = (NODE*) malloc(sizeof(NODE))))
         printf("Memory overflow in insert.\n");
         exit(100);


printf("malloc complete.\n");                                //testing to see if this is working, doesn't get this far


    pNew->data = item;

printf("start if statement.\n");

    if (pPre == NULL)
        {
            pNew->link = pList;
            pList = pNew;
        }
     else
        {
            pNew->link = pPre->link;
            pPre->link = pNew;
        }

printf("end else statement.\n");

     return pList;
}

Ответы [ 3 ]

5 голосов
/ 01 декабря 2011

Одна проблема, которую я сразу замечаю:

if (!(pNew = (NODE*) malloc(sizeof(NODE))))
     printf("Memory overflow in insert.\n");
     exit(100);

У вас есть оператор if, без фигурных скобок вокруг тела, и две строки с отступом, как будто они должны быть внутри тела оператора if. Только первая строка анализируется как часть оператора if; вторая строка, exit(100), происходит безоговорочно, поэтому ваша программа завершает работу, несмотря ни на что.

Вы, вероятно, должны изменить это на:

if (!(pNew = (NODE*) malloc(sizeof(NODE)))) 
{
     printf("Memory overflow in insert.\n");
     exit(100);
}

Если это не решит вашу проблему или вообще для будущих вопросов, я бы посоветовал вам опубликовать полученные результаты. Людям будет намного легче находить проблемы, если вы публикуете подробную информацию о том, что на самом деле происходит (например, вывод, неожиданное поведение и то, что вы ожидали, или тому подобное), а не просто говорите, что это не работает не более подробно.

3 голосов
/ 01 декабря 2011

Вы пропали без вести { }

if (!(pNew = (NODE*) malloc(sizeof(NODE))))
{
     printf("Memory overflow in insert.\n");
     exit(100);
}
1 голос
/ 01 декабря 2011

Одна проблема в том, что вы не инициализируете pPre перед использованием его значения

...