将链表放在 C 的结构中(分割错误)



我有一个任务是制作看起来像C语言中的酒店预订程序的东西。基本上我应该有 2 个结构,一个用于预订酒店房间(包含有关该房间的信息,例如其 ID、楼层、有多少张床之类的东西,指向预订房间的人的指针和将在那个房间里的人名单)和另一个用于人员的结构(其中包含, 比方说,人名姓)。

遇到的问题是我得到的分割错误,因为我可能没有使这些结构正确。

这是我代码的一部分,应该在列表中添加客人(位于预订结构中):

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <time.h>
#define MAXSTR 25
#define FORMAT_LEN 15
typedef struct person //structure that holds info about person
{
    char name[MAXSTR + 1];
    char surname[MAXSTR + 1];
}Guest;
typedef struct persons // list of persons
{
    Guest person;
    struct persons* next;
} Persons;
typedef struct //Pointer to first person in list
{
    Persons* list;
} List;
typedef struct room //structure that holds info about rooms that are reserved
{
    unsigned int ID;
    unsigned int floor;
    unsigned int bedcount;
    struct tm dateArrival;
    struct tm dateDep;
    bool cancelled;
    unsigned int price;
    Guest* person;
    List* list;
}Reservation;
typedef struct rooms
{
    Reservation room;
    struct rooms* next;
} Reservations;
bool PutGuestInsideList(List* list);
char* EnterString(char* str);
int main()
{
    Reservations* room = NULL;
    List list = { NULL };
    printf("New guest: n");
    if(PutGuestInsideList(room->room.list) == false)
        printf("Try again. n");

}
bool PutGuestInsideList(List* list)
{
    if(list == NULL)
        return false;
    Persons* newpers = (Persons*) malloc(sizeof(Persons));
    if(newpers == NULL)
        return false;
    printf("Name: ");
    EnterString(newpers->person.name);
    printf("Surname: ");
    EnterString(newpers->person.surname);
    list->list = newpers;
    return true;
}
char* EnterString(char* str)
{
    if (str == NULL)
        return str;
    char format[FORMAT_LEN] = "";
    sprintf(format, "%%%u[^n]", MAXSTR);
    scanf(format, str);
    scanf("%*[^n]");
    scanf("%*c");
    return str;
}

如果我在解释中遗漏了什么,请在评论中询问我。谢谢!

main中:

    int main()
    {
    Reservations* room = NULL;//here you initialise pointer with NULL
    List list = { NULL };
    printf("New guest: n");
    if(PutGuestInsideList(room->room.list) == false)// and here you try to access it
        printf("Try again. n");

}

在语句if,您正在访问指针room上的成员room.list,即使room NULL

顺便说一句:使用(或学习使用)调试器,您将能够更快地调试程序。(这就是为什么它们被称为调试器)

您取消引用了room,这在行if(PutGuestInsideList(room->room.list) == false)中为 NULL。不能取消引用 NULL 指针。应在主函数中正确设置room指针。

我认为你需要花一些时间在谷歌上查找有关 C 中指针的教程。 正如其他人指出的那样,房间设置为 null,但您取消引用它。

Reservations* room = NULL;
// and then
if(PutGuestInsideList(room->room.list) == false)

您还需要查看以下行:

EnterString(newpers->person.name);
EnterString(newpers->person.surname);

person.nameperson.name都没有写入缓冲区。它们是指针,不指向任何地方,但您尝试使用它们。

相关内容

  • 没有找到相关文章

最新更新