在结构中存储数据(链接列表)

时间:2017-10-21 15:28:05

标签: c list structure

大家好我学习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;
}

我知道代码是错误的,但自从昨天以来我一直在搞乱这个问题而且我无法理解,有人可以帮我吗?

提前致谢

1 个答案:

答案 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;
}

注意:

  • 我已将指针从相当不明显的tempptr重命名为更具描述性的msguser
  • 我已经让该函数返回成功代码:0表示成功,-1表示失败。
  • strncmp只会比较一定数量的字符。我已将此更改为strcmp,因此用户Paul和Pauline被视为不同。
  • 没有必要使遍历指针成为指向节点的指针。该技术很有用,但仅在您要插入或删除节点时才有用。在前面插入是一个特殊情况,你不会需要它。 (并且您插入了一条消息,而不是用户,所以如果您想在其他地方而不是在前面插入消息,您可以使用指向消息节点的指针遍历子列表。)