我有一个非常基本的单链表实现。然而,我的实现的问题在于它在列表的开头打印了一个额外的零,而我没有为这个额外的节点显式分配任何存储空间。相同的代码如下 -
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define LEN 7
/* List node data structure */
typedef struct _ll_node_ {
int data;
struct _ll_node_ *next;
} node;
/*
* @brief Utility to print the state of the list
*/
void print_list(node *head)
{
int i = 0;
node *tmp = head;
while (tmp)
{
printf("Node:t%d,tValue:t%dn", ++i, tmp->data);
tmp = tmp->next;
}
printf("n");
}
/*
* @brief Utility to add nodes to the list
*/
node *add_node(node *head, int data)
{
node *tmp;
if (head == NULL)
{
head = malloc(sizeof(node));
assert(head != NULL);
head->data = data;
head->next = NULL;
}
else
{
tmp = head;
while (tmp->next)
tmp = tmp->next;
tmp->next = malloc(sizeof(node));
assert(tmp->next != NULL);
tmp = tmp->next;
tmp->data = data;
tmp->next = NULL;
}
return head;
}
/*
* @brief Driver function
*/
int main(int argc, char *argv[])
{
node *head = NULL;
int i = 0;
/* Allocate memory */
head = malloc(LEN * sizeof(node));
assert(head != NULL);
/* Populate the list */
for (; i < LEN; i++)
head = add_node(head, rand() % 1000);
/* Print its state */
print_list(head);
return 0;
}
有人可以帮我找出我做错的地方吗?
System information:
Distributor ID: Ubuntu
Description: Ubuntu 14.04.3 LTS
Release: 14.04
Codename: trusty
您已经在 main 中为 head 分配内存,因此从未为第一个节点分配数据,因此默认情况下它将其视为 0。试试这个:
int main(int argc, char *argv[])
{
node *head = NULL;
int i = 0;
/* Populate the list */
for (; i < LEN; i++)
head = add_node(head, rand() % 1000);
/* Print its state */
print_list(head);
return 0;
}
此语句
head = malloc(LEN * sizeof(node));
没有意义。删除它。
您分配了未初始化的数组。因此,使用函数add_node会导致未定义的行为。
考虑到如果通过引用传递头部,函数add_node
可以写得更简单。例如
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <time.h>
#define LEN 7
/* List node data structure */
typedef struct _ll_node_ {
int data;
struct _ll_node_ *next;
} node;
/*
* @brief Utility to print the state of the list
*/
void print_list(node *head)
{
int i = 0;
node *tmp = head;
while (tmp)
{
printf("Node:t%d,tValue:t%dn", ++i, tmp->data);
tmp = tmp->next;
}
printf("n");
}
/*
* @brief Utility to add nodes to the list
*/
int add_node( node **head, int data )
{
int success;
while ( *head != NULL ) head = &( *head )->next;
*head = malloc( sizeof( node ) );
success = *head != NULL;
if (success )
{
( *head )->data = data;
( *head )->next = NULL;
}
return success;
}
/*
* @brief Driver function
*/
int main( void )
{
node *head = NULL;
int i = 0;
srand( ( unsigned int )time( NULL ) );
/* Populate the list */
for ( ; i < LEN; i++ )
add_node( &head, rand() % 1000);
/* Print its state */
print_list( head );
return 0;
}