如何防止新添加的用户在 C 中的链表中的同一迭代中年龄增加?

问题描述 投票:0回答:1

我正在创建一个用户链接列表,其中一个字段是

int age;

用户可以从多个选项中进行选择(

addUser
findUser
exit
等)

while
循环的每次迭代中,我想将所有用户的年龄增加 5,但在我当前的实现中,新添加的用户也会受到影响,尽管它在添加到链表。

我该如何解决这个问题?

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

#define BUFFER 1024
#define ADD_USER 1
#define ADD_USER 1
#define COMPLAINTS_AM 2
#define COMPLAINTS_EDA 3
#define COMPLAINTS_ASAFSUF 4
#define FIND_USER 5
#define PRINT_ALL_USERS 6
#define EXIT 7
#define TRUE 1
#define FALSE 0

typedef enum Type
{
    Am = 0,
    Eda,
    Asafsuf
} Type;

typedef struct User
{
    int id;
    int counter;
    int age;
    char *name;
    Type type;
    struct User *next;
} User;

int main()
{
    int choice = 0;
    int isGoingOn = TRUE;

    User *head = NULL;

    while (isGoingOn)
    {
        printMenu();
        scanf("%d", &choice);

        increaseUsersAge(&head); // problematic (?!)
        RemoveUsersOverForty(&head);

        switch (choice)
        {
        case ADD_USER:
            addUser(&head);
            break;
        case COMPLAINTS_AM:
            printf("Ma Nishte?\n");
            addOneForAm(&head);
            break;
        case COMPLAINTS_EDA:
            printf("Lehamiteno berahav\n");
            addOneForEda(&head);
            break;
        case COMPLAINTS_ASAFSUF:
            printf("Mi Yaachileno Basar?\n");
            addOneForAsafsuf(&head);
            break;
        case FIND_USER:
            printUserById(&head);
            break;
        case PRINT_ALL_USERS:
            printAllUsers(head);
            break;
        case EXIT:
            isGoingOn = FALSE;
            break;
        default:
            printf("wrong choose please choose again.\n");
        }

        printf("\n");
    }

    freeMemory(&head);
    return EXIT_SUCCESS;
}

这是我的

addUser
功能:

void addUser(User **head)
{
    // create new user
    User *newUser = malloc(sizeof(User));

    // get id from user
    printf("please insert id:\n");
    scanf("%d", &newUser->id);
    if (checkValidId(head, newUser->id) == FALSE)
    {
        printf("error\n");
        freeMemory(head);
        exit(1);
    }

    // get name from user
    printf("please insert name:\n");
    newUser->name = malloc(BUFFER * sizeof(char));
    scanf(" %[^\n]s", newUser->name);

    // get type from user
    printf("please insert type (Am - 0, Eda - 1, Asafsuf - 2):\n");
    scanf("%d", &newUser->type);

    newUser->counter = 0;
    newUser->age = 0;
    newUser->next = NULL;

    if (*head == NULL)
    {
        *head = newUser;
        return;
    }

    // insert to end of linked list
    User *curr = *head;
    while (curr->next != NULL)
    {
        curr = curr->next;
    }
    curr->next = newUser;
}

还有我的

increaseUsersAge
功能:

void increaseUsersAge(User **head)
{
    User *curr = *head;
    while (curr)
    {
        curr->age += 5;
        curr = curr->next;
    }
}
c dynamic-memory-allocation
1个回答
0
投票

一种方法是在

status
结构中添加一个
User
字段,该字段将保留用户是否是新添加的用户的信息。这个解决方案的问题是这个字段会占用列表中所有用户节点中的一些内存,一旦用户不再是新用户,这个字段就没用了。

其他解决方案可能是将

addUser()
的功能分为两部分 -

  • 第一部分:仅创建用户
  • 第二部分:将用户添加到列表中

此解决方案提供了在调用

increaseUsersAge()
函数后将新创建的用户添加到列表中的灵活性。

大致上,你可以这样做:

main()
中声明一个局部变量,说:

User *lastAddedUser = NULL;

case ADD_USER
循环的
while
中:

        case ADD_USER:
        lastAddedUser = createUser();
        if (lastAddedUser == NULL) {
            //print appropriate error message
            //free allocated memory and exit
            exit (EXIT_FAILURE);
        }

createUser()
中,只创建保存用户信息的节点并返回它。

while
main()
循环体中:

while (isGoingOn)
{
    printMenu();
    scanf("%d", &choice);

    increaseUsersAge(&head); // problematic (?!)
    
    if (lastAddedUser) {
        addUserToList(&head, lastAddedUser);
        lastAddedUser = NULL;
    }
    
    RemoveUsersOverForty(&head);

    switch (choice)
    .....
    .....

addUserToList()
函数中,只需添加其引用作为参数传递的用户
lastAddedUser
-

void addUserToList(User **head, User * lastAddedUser) {
    if (*head == NULL) {
        *head = newUser;
        return;
    }

    // insert to end of linked list
    User *curr = *head;

    while (curr->next != NULL) {
        curr = curr->next;
    }

    curr->next = newUser;
}

这样新添加的用户就不会受到添加新用户后立即调用

increaseUsersAge()
的影响。

© www.soinside.com 2019 - 2024. All rights reserved.