我正在尝试为链表建立基本操作库,但我遇到了函数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(而不冒忘记分配的风险