【发布时间】:2020-07-21 20:29:48
【问题描述】:
我正在尝试为链表构建基本操作库,但我遇到了函数push_back() 的问题:将数据推送到链表的末尾。
这是我的源代码:
node* push_back(node *dir, item datain)
{
node *newnode = (node *)malloc(sizeof(node));
newnode->data = datain;
newnode->next = NULL;
if (dir == NULL)
{
dir = newnode;
}
else
{
while (dir->next != NULL)
dir = dir->next;
dir->next = newnode;
}
return dir;
}
void printlist(node *dir)
{
printf("%-50s%-50s%-20s\n", "Name", "Email", "Phone number");
while (dir != NULL)
{
item temp = dir->data;
printf("%-50s%-50s%-20s\n", temp.name, temp.email, temp.phone);
dir = dir->next;
}
}
int main()
{
node *dir = (node *) malloc(sizeof(dir));
dir = NULL;
int i = 0;
while(i<3)
{
item temp = userdata();
dir = push_back(dir, temp);
i++;
}
printlist(dir);
freelist(dir);
return 0;
}
我的问题:如果我只插入 2 条记录(每条记录都有姓名、电子邮件和电话号码),那就没问题了。但是,如果有超过 2 条记录,当我打印插入的全部记录时,它只会打印出最新的两条记录。我在一些网站上检查了我的代码,但我发现它们与我的完全不同。 例如:
输入:
输入姓名:乔伊
输入邮箱:Joey@gmail.com
输入电话号码:0235632514
输入姓名:马修
输入电子邮件:Mathew@gmail.com
输入电话号码:012502252
输入姓名:韦利
输入邮箱:Waley@gmail.com
输入电话号码:036625125
输出:
姓名 电子邮件 电话号码
Mathew Mathew@gmail.com 012502252
Waley Waley@gmail.com 036625125
【问题讨论】:
-
node *dir = (node *) malloc(sizeof(dir));看起来不对。如果有的话,它应该是sizeof(*dir)。尽管无论如何您都会在下一行泄漏该内存,但这完全没有意义 -
@UnholySheep 它并没有解决我说的问题。实际上我的语法仍然是正确的,但它可能会令人困惑
-
我怀疑问题是
dir = push_back(dir, temp);- 你用函数返回的指针“覆盖”指针,它始终是列表的倒数第二个节点 -
@UnholySheep 我同意你的观点,但我发现这里的错误很难找出,因为它与 Internet 上的代码几乎相同
-
将您的代码与您在 Internet 上找到的代码进行比较是找出问题的不好方法。您需要使用调试器单步调试代码和/或分析您在纸上所做的工作
标签: c linked-list dynamic-memory-allocation