c-链接列表后面的插入错误



我正在尝试为链表建立基本操作库,但我遇到了函数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%-20sn", "Name", "Email", "Phone number");
while (dir != NULL)
{
item temp = dir->data;
printf("%-50s%-50s%-20sn", 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;
}

我的问题是:如果我只插入两条记录(每条记录都有姓名、电子邮件和电话号码(,那没关系。但是,如果有两条以上的记录,当我打印我插入的所有记录时,它只打印出最后两条记录。我在一些网站上查看了我的代码,但我发现它们与我的代码毫无相似之处。例如:

输入:

输入名称:Joey

输入电子邮件:Joey@gmail.com

输入电话号码:0235632514

输入名称:Mathew

输入电子邮件:Mathew@gmail.com

输入电话号码:012502252

输入名称:Waley

输入电子邮件:Waley@gmail.com

输入电话号码:036625125

输出:

姓名电子邮件电话号码

马修Mathew@gmail.com012502252

瓦利Waley@gmail.com036625125

第一个问题:

node *dir = (node *) malloc(sizeof(dir));
dir = NULL;

所以你有内存泄漏,因为你失去了分配,只需要做

node *dir = NULL;

第二个问题push_back返回列表的最后一个元素,因此执行

dir = push_back(dir, temp);

dir现在指向最后一个元素,并且您失去了列表的头部,因此除了最后一个之外的所有元素

一种方法是修改push_back以返回列表的(新(头:

node* push_back(node * head, item datain)
{
node *newnode = (node *)malloc(sizeof(node));
newnode->data = datain;
newnode->next = NULL;
if (head == NULL)
return newnode;
node * dir = head;
while (dir->next != NULL)
dir = dir->next;
dir->next = newnode;
return head;
}

但这假设调用者总是执行类似于dir=push_back(dir,temp(的操作

另一种方法是使用双指针:

void push_back(node ** head, item datain)
{
node *newnode = (node *)malloc(sizeof(node));
newnode->data = datain;
newnode->next = NULL;
if (*head == NULL)
*head = newnode;
else {
node * dir = *head;
while (dir->next != NULL)
dir = dir->next;
dir->next = newnode;
}
}

调用方只需执行push_back(&dir,temp(而不冒忘记分配的风险

相关内容

  • 没有找到相关文章

最新更新