C Связанные списки Не могу вставить - PullRequest
0 голосов
/ 27 апреля 2018

Я сейчас сталкиваюсь с ошибкой на C, использую Visual Studio и впервые работаю с Связанными списками , я пытаюсь сделать проект немного более структурированным, и из-за этого Я сталкиваюсь с некоторыми проблемами. Ошибка, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь вставить элемент в связанный список, моя программа просто падает, и выдает мне эту ошибку:

Исключение, сгенерированное в 0x500CC944 (ucrtbased.dll) в Lesson_LinkedLists.exe: 0xC0000005: нарушение доступа при записи в локальный 0xCDCDCDCD.

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

Вот мои структуры, распределение памяти и функция вставки:

typedef struct Word
{
    char Text[Max_Letters];
}*pt_Word;

typedef struct Node_Element
{
    pt_Word Word_Data;
    struct Node_Element * Next_Node_Element;
}*pt_Node_Element;

typedef struct List
{
    char Language[2];
    int Number_Words_List;
    pt_Node_Element Header;
}*pt_List;

pt_List List_Dynamic_Memory();

pt_Node_Element Node_Dynamic_Memory();

void Insert_Element_Begin(pt_Node_Element Node_Element, pt_List List_Pointer);

int main()
{
    int option;
    pt_Node_Element Node;
    pt_List List;
    List = List_Dynamic_Memory();
    Node = Node_Dynamic_Memory();

    do
    {
        option = menu();
        switch (option)
        {
            case 1: 
            {
                printf("Diga-me uma palavra : \n");
                //  fflush(stdin);
                gets_s(Node->Word_Data->Text);
                Insert_Element_Begin(Node, List);
                break;
            }   
            case 2: 
            {
                Display_List(Node, List); break;
            }
        }
    } while (option != 0);
    //system("Pause");
}

pt_List List_Dynamic_Memory()
{
    pt_List List_Pointer;

    List_Pointer = (pt_List)malloc(sizeof(struct List));

    List_Pointer->Header = NULL;
    List_Pointer->Number_Words_List = 0;

    return List_Pointer;

};

pt_Node_Element Node_Dynamic_Memory()
{
    pt_Node_Element  Node_Pointer;

    Node_Pointer = (pt_Node_Element)malloc(sizeof(struct Node_Element));

    Node_Pointer->Next_Node_Element = NULL;

    return Node_Pointer;
};

void Insert_Element_Begin(pt_Node_Element Node_Element, pt_List List_Pointer)
{
    List_Pointer->Number_Words_List++;

    if (List_Pointer->Header == NULL)
    {
        List_Pointer->Header = Node_Element;
        Node_Element->Next_Node_Element = NULL;

        return;
    }

    Node_Element->Next_Node_Element = List_Pointer->Header;
    List_Pointer->Header = Node_Element;
};

Мне интересно, связано ли это с выделением памяти, я новичок, поэтому прошу прощения, если это глупая ошибка. Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 27 апреля 2018

Как уже упоминалось в комментариях, вы никогда не выделяете место для Word_Data. Чтобы это исправить, вы можете использовать malloc():

pt_Node_Element Node_Dynamic_Memory()
{
    pt_Node_Element  Node_Pointer;

    Node_Pointer = (pt_Node_Element)malloc(sizeof(struct Node_Element));

    // Alloc mem for this too
    Node_Ponter->Word_Data = malloc(sizeof(struct Word));

    // You should also always check the value returned from malloc

    Node_Pointer->Next_Node_Element = NULL;

    return Node_Pointer;
};

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

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

struct Node_Element
{
    struct Word Word_Data;  // Does not need malloc
    struct Node_Element * Next_Node_Element;
};

И не забудьте free все, что вы malloc.

...