我有一个非常基本的单链表实现。然而,我的实现的问题是它在列表的开头打印了额外的零,而我没有为这个额外的节点显式分配任何存储。代码如下 -
#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%d\n", ++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
答案 0 :(得分:6)
您已经在main中分配内存,因此第一个节点从未被分配数据,因此默认情况下它将为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;
}
答案 1 :(得分:4)
本声明
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%d\n", ++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;
}