问题
This is a basic linked list that adds nodes and then prints them but for some reason it doesn't work correctly. From what I've tested it fails after printing the list it gets to the point where it prints the wage where it incorrectly prints the number and then terminates.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node_s {
char job_title[25];
double hourly_wage;
struct node_s *next;
} node_t;
void print_list(node_t *list);
void add_node(node_t **head, char *title, double hwage);
int main()
{
node_t *list;
list = NULL;
add_node(&list, "Programmer", 32.35);
print_list(list);
add_node(&list, "Analyst", 25.80);
print_list(list);
add_node(&list, "Technician", 17.50);
print_list(list);
add_node(&list, "Clerk", 12.00);
print_list(list);
add_node(&list, "Manager", 53.58);
print_list(list);
return(0);
}
void print_list(node_t *list){
node_t *current;
if (current == NULL) {
printf("\n");
}else{
printf("The job is called:%s\n", current->job_title);
printf("The job pays %d hourly.\n", current->hourly_wage);
print_list(current->next);
}
}
void add_node(node_t **head, char *title, double hwage){
node_t *current = head;
node_t *newNode = (node_t *) malloc(sizeof(node_t));
if (newNode == NULL) {
printf("malloc failed\n");
exit(-1);
}
strcpy(newNode->job_title, title);
newNode->hourly_wage = hwage;
newNode->next = NULL;
while (current->next) {
current = current->next;
}
current->next = newNode;
}
回答1:
In following part of code:
void print_list(node_t *list){
node_t *current;
if (current == NULL) {
You are comparing uninitialized value of current pointer with null. I think you forgot to assign value to it:
current = list;
Before if instruction.
回答2:
Change functions the following way
void print_list( node_t *list )
{
if ( list == NULL )
{
printf( "\n" );
}
else
{
printf("The job is called:%s\n", list->job_title);
printf("The job pays %f hourly.\n", list->hourly_wage );
print_list( list->next );
}
}
void add_node( node_t **head, const char *title, double hwage )
{
node_t *newNode = ( node_t * )malloc( sizeof( node_t ) );
if ( newNode == NULL )
{
printf( "malloc failed\n" );
exit( -1 );
}
strncpy( newNode->job_title, title, 25 );
newNode->job_title[24] = '\0';
newNode->hourly_wage = hwage;
newNode->next = NULL;
while ( *head )
{
head = &( *head )->next;
}
*head = newNode;
}
Here is a demonstrative program
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node_s {
char job_title[25];
double hourly_wage;
struct node_s *next;
} node_t;
void print_list( node_t *list )
{
if ( list == NULL )
{
printf( "\n" );
}
else
{
printf("The job is called:%s\n", list->job_title);
printf("The job pays %f hourly.\n", list->hourly_wage );
print_list( list->next );
}
}
void add_node( node_t **head, const char *title, double hwage )
{
node_t *newNode = ( node_t * )malloc( sizeof( node_t ) );
if ( newNode == NULL )
{
printf( "malloc failed\n" );
exit( -1 );
}
strncpy( newNode->job_title, title, 25 );
newNode->job_title[24] = '\0';
newNode->hourly_wage = hwage;
newNode->next = NULL;
while ( *head )
{
head = &( *head )->next;
}
*head = newNode;
}
int main(void)
{
node_t *list;
list = NULL;
add_node(&list, "Programmer", 32.35);
print_list(list);
add_node(&list, "Analyst", 25.80);
print_list(list);
add_node(&list, "Technician", 17.50);
print_list(list);
add_node(&list, "Clerk", 12.00);
print_list(list);
add_node(&list, "Manager", 53.58);
print_list(list);
return 0;
}
The output is
The job is called:Programmer
The job pays 32.350000 hourly.
The job is called:Programmer
The job pays 32.350000 hourly.
The job is called:Analyst
The job pays 25.800000 hourly.
The job is called:Programmer
The job pays 32.350000 hourly.
The job is called:Analyst
The job pays 25.800000 hourly.
The job is called:Technician
The job pays 17.500000 hourly.
The job is called:Programmer
The job pays 32.350000 hourly.
The job is called:Analyst
The job pays 25.800000 hourly.
The job is called:Technician
The job pays 17.500000 hourly.
The job is called:Clerk
The job pays 12.000000 hourly.
The job is called:Programmer
The job pays 32.350000 hourly.
The job is called:Analyst
The job pays 25.800000 hourly.
The job is called:Technician
The job pays 17.500000 hourly.
The job is called:Clerk
The job pays 12.000000 hourly.
The job is called:Manager
The job pays 53.580000 hourly.
You need only to write function that will delete all allocated memory for the list.
来源:https://stackoverflow.com/questions/27069977/linked-list-isnt-working-properly