Home > other >  new to lists, function doesn't print list elements
new to lists, function doesn't print list elements

Time:01-15

I am a beginner to C and am learning linked lists. I tried making functions to have everything organised but no matter what i do the function print_list doesn't print the values. The output is only START and END. I noticed that if I put the same block of code directly into the function that builds the lists, then it prints correctly. What am I doing wrong? (Also first time asking on stack overflow) Thank you to whoever answers.

#include <stdlib.h>
#include <stdio.h>

typedef struct nd
{
    int val;
    struct nd *next;
} node;
typedef node * Lista;

void print_list(node*currnode)
{
    printf("START -> ");
    while (currnode != NULL)
    {
        printf("%d -> ", currnode->val);
        currnode = currnode->next;
    }
    printf("END");
}
//reimpilista means "buildlist"
node*riempilista(Lista lis){
    node  *currentNode, *temp;
    int i,n;
    
    printf("how many nodes?\n");
    scanf("%d",&n);

    for (i = 0; i < n; i  )
    {
        currentNode = (node *)malloc(sizeof(node));
  
        printf("Enter element %d : ", (i   1));
        scanf("%d", &currentNode->val);
        
        if (i == 0)
        {
            temp = currentNode;
        }
        else
        {  
            temp->next = currentNode;
            temp = currentNode;
        }
    }

    temp->next = NULL;
    return lis;
}

int main(){
    Lista listautente=NULL;
    listautente=riempilista(listautente);
    print_list(listautente);
    return 0;
}

CodePudding user response:

When you build the list you need to return the head of the list as a result. So you need to store the pointer to the first node. Then when adding a new node you need to know the previous node, so you need to store it as well. The last added node should have next field poiting to NULL otherwise you won't be able to determine the end of the list and will get an exception.

Here is your code slightly edited.

#include <stdlib.h>
#include <stdio.h>

typedef struct nd {
    int val;
    struct nd *next;
} node;

typedef node *Lista;

void print_list(node *currnode) {
    printf("START -> ");
    while (currnode != NULL) {
        printf("%d -> ", currnode->val);
        currnode = currnode->next;
    }
    printf("END");
}

//reimpilista means "buildlist"
node *riempilista() {
     node *firstNode = NULL, *currentNode = NULL, *previousNode = NULL;
     int i, n;
    
    printf("how many nodes?\n");
    scanf("%d", &n);

    for (i = 0; i < n;   i) {
        currentNode = (node *)malloc(sizeof(node));
        
        printf("Enter element %d : ", (i   1));
        scanf("%d", &currentNode->val);
        currentNode->next = NULL;
        
        if (i == 0) {
            firstNode = currentNode;
        }

        if (previousNode != NULL) {        
            previousNode->next = currentNode;
        }

        previousNode = currentNode;
    }

    return firstNode;
}

int main() {
    Lista listautente = riempilista();
    print_list(listautente);
    return 0;
}

CodePudding user response:

I tried to fix your program with minimal changes. Here it is:


Change

node  *currentNode, *temp;

to

node  *currentNode, *temp, *head;




Change

temp = currentNode; 

to

temp = currentNode; head = temp;




Change

return lis;

to

return head;

Here is the link to the modified code: https://onlinegdb.com/8cjqifgl2

  • Related