双向链表在末尾添加节点只显示printf上的第一个和最后一个节点

时间:2014-03-05 10:29:30

标签: c algorithm data-structures doubly-linked-list

我正在尝试创建一个双向链表,我已经在开始时成功完成了插入,但没有结束。

当尝试在结尾添加节点时,它只打印第一个和最后一个节点而不是它们之间的节点

我的代码如下:

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->"

我认为有一些逻辑问题,我找不到的东西。在我的逻辑中,任何人都能纠正我吗?

3 个答案:

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