我创建了一个非常基本的链接列表,它没有输出任何内容。我无法输出任何内容。出了什么问题?我在控制台上没有收到任何错误。我正在学习节点后尝试C,并对JS做出反应。C与JS截然不同。
typedef struct node {
int data;
struct node *next;
} node;
//Creates new node
node *createNewNode(int data){
node *tmp = malloc(sizeof(node));
tmp->data = data;
tmp->next = NULL;
return tmp;
}
//adds node at the end
void addNodeAtEnd(node *head, node *nodeToInsert){
node *tmp = head;
//If head is null, make first node your head
if (head==NULL)
{
head=nodeToInsert;
return;
}
//Insert new node at the end
//traverse through whole node to reach the end
while (tmp->next != NULL)
{
tmp=tmp->next;
}
//Finally insert at the last nodes
tmp->next = nodeToInsert;
}
//views all nodes
void viewAllNodes(node *head){
node *tmp = head;
while(tmp->next != NULL){
printf("%d - ", tmp->data);
tmp=tmp->next;
}
}
int main(){
node *head = NULL;
addNodeAtEnd(head,createNewNode(1));
addNodeAtEnd(head,createNewNode(2));
addNodeAtEnd(head,createNewNode(3));
viewAllNodes(head);
}
像一样声明的函数addNodeAtEnd
void addNodeAtEnd(node *head, node *nodeToInsert);
通过值接受在CCD_ 3中声明的指针CCD_。这意味着该函数处理指针值的副本。更改副本不会反映在原始指针上。
您需要通过引用传递指针。
在C语言中,通过引用传递意味着通过指向对象的指针间接传递对象。取消引用指针可以直接访问原始对象。
功能可以通过以下方式声明和定义
//Creates new node
node * createNewNode(int data)
{
node *tmp = malloc(sizeof(node));
if ( tmp != NULL )
{
tmp->data = data;
tmp->next = NULL;
}
return tmp;
}
//adds node at the end
int addNodeAtEnd(node **head, node *nodeToInsert )
{
int success = nodeToInsert != NULL;
if ( success )
{
while ( *head != NULL ) head = &( *head )->next;
*head = nodeToInsert;
}
return success;
}
主要来说,这个函数被称为
addNodeAtEnd( &head, createNewNode(1));
尽管按照的方式声明和定义函数会更好
//adds node at the end
int addNodeAtEnd(node **head, int data )
{
node *nodeToInsert = createNewNode( data );
int success = nodeToInsert != NULL;
if ( success )
{
while ( *head != NULL ) head = &( *head )->next;
*head = nodeToInsert;
}
return success;
}
并称之为
addNodeAtEnd( &head, 1 );
函数viewAllNodes
也有一个错误。例如,由于while循环中的条件,当列表仅包含一个节点时,它将不输出任何内容
while(tmp->next != NULL){
应按照以下方式定义功能
//views all nodes
void viewAllNodes( const node *head )
{
for ( ; head != NULL; head = head->next )
{
printf("%d - ", tmp->data);
}
puts( "null" );
}