我环顾四周,我不确定它是否已被发布,但我正在尝试在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.
答案 0 :(得分:2)
第一个值得注意的问题是你似乎有一个虚拟节点
在列表的开头
struct node* head1;
head1 = (struct node*)malloc(sizeof(struct node));
head1 -> next = NULL;
但您从head
而不是head->next
开始打印
即包括虚节点。
答案 1 :(得分:0)
head1
和head2
是您在main
中分配的未初始化的节点。然后,您向head1
添加两个节点,向head2
添加无节点。然后,您可以打印head1
和head2
的列表。因此,他们首先打印那些未初始化的节点。
答案 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
,如果这是列表的结尾,那么这个检查甚至不是必需的,因此可以一起删除