大家好我学习C并且有些问题我无法解决。
首先,这是我的数据结构:
struct user_node {
void *name;
struct user_node *next;
struct msg_node *msgnext;
};
struct msg_node {
void *sender;
void *receiver;
void *title;
void *content;
struct msg_node *msgnext;
};
struct user_node *user_database = NULL;
这个想法是用户可能有一条或多条消息。
我可以创建和删除用户,但我在存储邮件时遇到问题,例如:
此函数的目的是将temp作为消息放在我的数据结构中,用于我们在消息本身中找到的给定用户。 (temp已经是msg_node,包含我从另一个函数获取的数据)
void sendMsg(struct msg_node* temp) {
//if list is empty
if (user_database == NULL) {
printf("There aren't users on the system.\n\n");
return;
}
struct user_node** ptr = &user_database;
while (*ptr) {
if (strncmp((*ptr)->name, (temp)->receiver, strlen(temp-
>receiver)) == 0) {
temp->msgnext = &user_database->msgnext;
user_database->msgnext = temp;
return;
}
ptr = &(*ptr)->next;
}
printf("User not found on the system\n\n");
return;
}
我知道代码是错误的,但自从昨天以来我一直在搞乱这个问题而且我无法理解,有人可以帮我吗?
提前致谢
答案 0 :(得分:1)
您可以在链接列表的前面插入一个节点,方法是设置新节点的下一个指向列表头部的指针,然后将lis的头部设置为新节点。当列表的头部为NULL
时,这甚至适用于空列表。
你已经知道了这一点,但是List的头部是与当前用户相关联的头部,而不是用户列表的头部,即数据库中的第一个用户。 / p>
以下代码应该执行您想要的操作:
int sendMsg(struct msg_node *msg)
{
struct user_node *user = user_database;
if (user == NULL) {
printf("There aren't users on the system.\n");
return -1;
}
while (user) {
if (strcmp(ptr->name, msg->receiver) == 0) {
msg->msgnext = user->msgnext;
user->msgnext = msg;
return 0;
}
user = user->next;
}
printf("User '%s' not found on the system.\n", msg->receiver);
return -1;
}
注意:
temp
和ptr
重命名为更具描述性的msg
和user
。strncmp
只会比较一定数量的字符。我已将此更改为strcmp
,因此用户Paul和Pauline被视为不同。