我正在创建一个用户链接列表,其中一个字段是
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;
}
}
一种方法是在
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()
的影响。