LinkedList包含不需要的零

时间:2015-02-25 02:27:31

标签: c pointers struct linked-list

我环顾四周,我不确定它是否已被发布,但我正在尝试在C中创建两个链接列表。当它们应该是空的时候#39;有零。我不确定这些零来自哪里,它让我感到困惑。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct node
{
    int price;
    int bookNumber;

    struct node * next;

};


void addNode(struct node* pHead, int pPrice, int pBookNumber);
void displayList(struct node* pHead);
void removeNode(struct node* pHead, int pBookNumber);

int main()
{

    struct node* head1;
    head1 = (struct node*)malloc(sizeof(struct node));
    head1 -> next = NULL;

    addNode(head1, 10, 1234);
    addNode(head1, 35, 9876);
    displayList(head1);
    printf("\n");
    struct node* head2;
    head2 = (struct node*)malloc(sizeof(struct node));
    head2 -> next = NULL;
   // addNode(head2,13, 8888);
    displayList(head2);

}

void addNode(struct node* pHead, int pPrice, int pBookNumber)
{

    struct node* newNode;
    struct node* ptr;

    newNode = (struct node*)malloc(sizeof(struct node));

    newNode -> price = pPrice;
    newNode -> bookNumber = pBookNumber;

    newNode -> next = NULL;

    ptr = pHead;

    if(pHead -> next == NULL)
    {
        pHead -> next = newNode;
        newNode -> next = NULL;
    }
    else
    {
        while((ptr -> next != NULL))
        {
            ptr = ptr -> next;
        }

        ptr -> next = newNode;
        newNode -> next = NULL;

    }

}

void removeNode(struct node* pHead,int pBookNumber)
{

    struct node *current, *prev;
    current = pHead;
    /*searching list for the desired data*/
    while((current -> bookNumber != pBookNumber))
    {

        prev = current;

        current = current -> next;

    }

    /*fixing links between nodes*/
    prev -> next = current -> next;

    /*freeing memory*/
    free(current);

    /*removing from end of list*/
    if((current -> next = NULL))
    {

        prev -> next = NULL;

        /*freeing memory*/
        free(current);

    }

}

void displayList(struct node* pHead)
{
        while(pHead != NULL)
        {
            printf("$%d, book# %d -> ", pHead -> price, pHead -> bookNumber);
            pHead = pHead -> next;
        }
        printf("NULL");

    }

我在第一个列表中添加了两个条目,并没有向第二个列表添加任何内容......这是输出:

$0, book# 0 -> $10, book# 1234 -> $35, book# 9876 -> NULL
$0, book# 0 -> NULL
Process returned 0 (0x0)   execution time : 0.001 s
Press ENTER to continue.

3 个答案:

答案 0 :(得分:2)

第一个值得注意的问题是你似乎有一个虚拟节点
在列表的开头

struct node* head1;
head1 = (struct node*)malloc(sizeof(struct node));
head1 -> next = NULL;

但您从head而不是head->next开始打印 即包括虚节点。

答案 1 :(得分:0)

head1head2是您在main中分配的未初始化的节点。然后,您向head1添加两个节点,向head2添加无节点。然后,您可以打印head1head2的列表。因此,他们首先打印那些未初始化的节点。

答案 2 :(得分:0)

您正在从头开始打印循环,并在一开始就为head1节点分配内存。这会导致它使用未分配的价格和书号打印节点的价格和编号。

这可以通过将指针(struct node **pHead)传递到addNode函数并添加检查头节点是否为NULL来解决。

newNode -> next = NULL;

ptr = pHead;

if(pHead -> next == NULL)
{
    pHead -> next = newNode;
    newNode -> next = NULL;
}
else
{
    while((ptr -> next != NULL))
    {
        ptr = ptr -> next;
    }

    ptr -> next = newNode;
    newNode -> next = NULL;

}

此代码有另一个问题。您在开始时将newNode的下一个指针设置为NULL,然后在退出if-else之前再次将其设置为NULL。这不是必需的,因为你总是走到列表的最后。

free(current);

/*removing from end of list*/
if((current -> next = NULL))
{

    prev -> next = NULL;

    /*freeing memory*/
    free(current);

}

此代码存在释放当前节点的问题,然后我假设您正在尝试检查您是否位于列表的最后。但是,您在此处使用赋值运算符。使用==进行比较,如果要尝试删除节点,这会导致分段错误,因为您正在尝试访问刚刚释放的内存。

另一件值得一提的是,current-&gt; next实际上是NULL,如果这是列表的结尾,那么这个检查甚至不是必需的,因此可以一起删除