Linked List isn't working properly

痞子三分冷 提交于 2019-12-14 04:07:18

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!