我正在尝试创建一个双向链表,我已经在开始时成功完成了插入,但没有结束。
当尝试在结尾添加节点时,它只打印第一个和最后一个节点而不是它们之间的节点。
我的代码如下:
insert_at_end(int data, node ** head) { //Where data is the data to be kept it in it's Info part.
node *temp, *temp2 = *head;
if (temp2 == NULL) {
temp2 = (node * ) malloc(sizeof(node));
temp2->freq = data;
temp2->next = NULL;
temp2->prev = *head;
*head = temp2;
} else {
temp = (node * ) malloc(sizeof(node));
temp->freq = data;
temp->next = NULL;
temp->prev = temp2;
temp2->next = temp;
}
}
打印代码是:
main() {
int size, data, i, pos, var, pos2;
node *head = NULL;
printf("enter the size of node\n");
scanf("%d", &size);
printf("start entering the number of elements until your size\n");
for (i = 1; i <= size; i++) {
scanf("%d", & data);
insert_at_end(data, & head);
}
node * temp1;
temp1 = head;
while (temp1 != NULL) {
printf("%d-> ", temp1->freq);
temp1 = temp1 -> next;
}
}
输出如下:
enter the size of node
5
start entering the number of elements until your size
1
2
3
4
5
1-> 5-> //It don't print "2->3->4->"
我认为有一些逻辑问题,我找不到的东西。在我的逻辑中,任何人都能纠正我吗?
答案 0 :(得分:4)
您最后没有添加新节点 要在最后添加,首先应通过迭代其间的所有其他节点来到达最后一个节点。
或者,
您可以跟踪指向最后一个节点的指针,然后在此之后添加新节点。
另外,指定插入函数的返回类型:
"void" insert_at_end(int data, node ** head)
C将未指定的返回类型视为int
,因此您的编译器可能会抱怨:"Control reached at the end of a non-void function"
答案 1 :(得分:1)
在插入结束功能时出错。
您应首先遍历非空列表以到达列表的末尾,然后在那里插入新节点。那么节点将被添加到最后位置。现在你写的东西使新节点被添加到第二个位置。并且其next
指针为NULL,因此结果列表将始终只包含2个节点
1st_node后跟包含最后一个节点的节点(具有最后输入值的节点)
答案 2 :(得分:0)
insert_at_end(int data, node * * head) //Where data is the data to be kept it in it's Info part.
{
node * temp,*temp2= *head;
if(temp2==NULL)
{
temp2 = (node * ) malloc(sizeof(node));
temp2 -> freq = data;
temp2 -> next = NULL;
temp2 -> prev = *head;
* head = temp2;
}
else
{
temp = (node * ) malloc(sizeof(node));
temp -> freq = data;
temp -> next = NULL;
while((temp2)->next!=NULL) //for moving to the end point
temp2=(temp2)->next;
temp -> prev = temp2;
temp2->next=temp;
}
}