Я впервые работаю со связанными списками.Хотелось бы получить некоторые критические замечания и предложения о том, как исправить определенные проблемы - PullRequest
0 голосов
/ 08 апреля 2019

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

Структура может быть определена как

struct request{
    int room_number;
    char first[NAME_LEN+1];
    char last[NAME_LEN+1];
    int num_items;
    struct request *next;
};

Я выполнилна несколько проблем с моими функциями:

  1. Функция добавления:
/*
APPEND FUNCTION:
Gets the room number, first name, last name, and the number of items the user wants to wash.
Creates a new node and appends it to the end of the linked list.
*/
struct request *append_to_list(struct request *list)
{
 struct request *new_node, *last_node, *search;


    new_node = malloc(sizeof(struct request));
    //new_node->next = NULL;

    if(new_node == NULL)
    {
        printf("Error allocating memory.\n");
        return list;
    }

    //get room number
    printf("Enter room number: ");
    scanf("%d", &new_node->room_number);

    //search to see if the room number already exists in the LL.
    for(search = list; search != NULL; search = search->next)
    {
        if(search->room_number == new_node->room_number)
        {
            printf("Room request already exists. Update request using main menu.");
            return list;
        }
    }

    //get first and last name
     printf("Enter first name: ");
    read_line(new_node->first, NAME_LEN+1);
    printf("Enter last name: ");
    read_line(new_node->last, NAME_LEN+1);

    //get the number of items.
    printf("Enter the number of items you wish to wash: ");
    scanf("%d", &new_node->num_items);

    new_node->next = list;


    //if list is empty, return pointer to newly created linked list.
    if(list == NULL)
    {
        list = new_node;
        return new_node;
    }
    //else add request to the end of the LL and return pointer to the LL.
    else
    {
        last_node = list;
        while(last_node->next!=NULL)
            last_node = last_node->next;
    }
    last_node->next = new_node;


 return list;

}

Некоторые проблемы, с которыми я столкнулся, заключаются в том, что по какой-то причине я не могу сделать больше двухЗапросы.Я получаю сообщение об ошибке, и программа вылетает.

Функция обновления:
/*
UPDATE FUNCTION:
User enters their room number and the node containing the room number is updated with the number of items the user wants to add on.
*/
void update(struct request *list)
{


    struct request *search;
    int add_items;

    //ask to enter room num
    printf("Enter room number: ");
    int room;
    scanf("%d\n", &room);

    //find matching room num
    for(search = list; search != NULL; search = search->next)
    {

        if(search->room_number == room)
        {
            //ask to enter num of items to be added and update num of items


            printf("How many items would you like to add: ");
            scanf("%d\n", &add_items);
            search->num_items = search->num_items + add_items;
            search = search->next;
            return;

        }
    }
    //if room num is not found, print a message.
            printf("Could not find request.");
    return;
}

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

Наконец, функция печати:
/*
PRINTLIST FUNCTION:
Prints all the nodes in list.
*/
void printList(struct request *list)
{
  //print room num, first and last name, and num of items for all requests on the list.
    while(list != NULL)
    {
        printf("%d ", list->room_number);
        printf("%s ", list->first);
        printf("%s ", list->last);
        printf("%d\n ", list->num_items);
        list = list->next;
    }
}

Моя единственная проблема с этой функцией заключается в том, что она бесконечно печатает все узлы без остановки.

Любая помощь приветствуется.Спасибо!

1 Ответ

3 голосов
/ 08 апреля 2019
  1. Вам нужно решить, хотите ли вы new_node в конце или в начале списка. list = new_node помещает его в начало, последующий цикл помещает его в конец, поэтому вы создаете циклический список без конца, и ваша следующая операция вставки застревает в бесконечном цикле. Если вы хотите, чтобы new_node был в начале, вам не нужно искать конец. Если вы хотите, чтобы это было в конце, тогда new_node->next должно быть установлено в NULL, а не в list.
  2. Ваше тело цикла for выполняется только один раз, потому что у вас есть return в обеих ветвях вашего оператора if.
  3. Это, вероятно, из-за пункта 1 выше.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...