Im writing project for my programming lessons and right now got some problems with output from function AddItemToClient, basicaly its mainly with date, in first node its correct one but after this its just random. Could someone explain what I'm doing wrong here?

#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
struct date
{
    int day;
    int month;
    int year;
    struct date* next;
};
struct item
{
    char item_name[30];
    char item_state[30];
    double item_price;
    char item_status[30];
    double item_price_if_not;
    struct date *issue_date;
    struct item *next;
};
struct client
{
    char client_name[30];
    char client_last_name[30];
    struct item *item_data;
    struct client *next;
};
//ADD CLIENT//
void *AddClient(struct client **head, char name[30], char last_name[30])
{
    if((*head) == NULL)
    {
        *head = malloc(sizeof(struct client));
        strcpy((*head)->client_name,name);
        strcpy((*head)->client_last_name,last_name);
        (*head)->next = NULL;
        (*head)->item_data = NULL;
    }
    else
{
    struct client *temp;
    temp = (*head);
    //             //
    while(temp->next)
    temp=temp->next;
    //              //
    (temp->next) = malloc(sizeof(struct client));
    strcpy(temp->next->client_name,name);
    strcpy(temp->next->client_last_name,last_name);
    temp->next->next = NULL;
    temp->next->item_data = NULL;
}
}
//ADD CLIENT END//
//////////////////
//FIND TO ADD//
struct client *FindToAdd(struct client *head, char named[30],char last_name[30])
{
    struct client *current = head;
    while(current != NULL)
    {
        if((strcmp(current->client_name,named) == 0 )&& (strcmp(current->client_last_name,last_name) == 0))
        {
            printf("Client found :%s %s\n",current->client_name,current->client_last_name);
            return current;
        }
        current = current->next;
    }
    return (NULL);
}
//FIND TO ADD END//
///////////////////
//ADD ITEM TO CLIENT//
void AddItemToClient(struct client *head, char item_name[30],char item_state[30],double price,char status[30],double price_if_not,int day,int month,int year)
{
    struct client *tempc;
    tempc = head;
    if(tempc->item_data == NULL)
    {
       tempc->item_data = malloc(sizeof(struct item));
       strcpy(tempc->item_data->item_name,item_name);
       strcpy(tempc->item_data->item_state,item_state);
       strcpy(tempc->item_data->item_status,status);
       tempc->item_data->item_price = price;
       tempc->item_data->item_price_if_not = price_if_not;
       tempc->item_data->issue_date = malloc(sizeof(struct date));
       tempc->item_data->issue_date->day = day;
       tempc->item_data->issue_date->month = month;
       tempc->item_data->issue_date->year = year;
       tempc->item_data->next = NULL;
       tempc->item_data->issue_date->next = NULL;
    }
    else
    {
        struct client *temp;
        temp = head;
        while(temp->item_data->next) temp->item_data=temp->item_data->next;

        temp->item_data->next = malloc(sizeof(struct item));
        strcpy(temp->item_data->next->item_name,item_name);
        strcpy(temp->item_data->next->item_state,item_state);
        strcpy(temp->item_data->next->item_status,status);
        temp->item_data->next->item_price = price;
        temp->item_data->next->item_price_if_not = price_if_not;
        temp->item_data->next->issue_date = malloc(sizeof(struct date));
        temp->item_data->next->issue_date->day;
        temp->item_data->next->issue_date->month;
        temp->item_data->next->issue_date->year;
        temp->item_data->next->next = NULL;

    }
}
//ADD ITEM TO CLIENT END//
//////////////////////////
// DISPLAY//
void Display(struct client *head)
    {int i=1,b=1;
    struct client *current;
    current = head;
        while(current != NULL)
        {
           printf("[%d] Client name:%s %s \n",i, current->client_name, current->client_last_name);
           struct item *CurrentItem = head->item_data;
           while(CurrentItem != NULL)
           {
             printf("-----------------------------------------------\n");
             printf("[%d] \n",b);
             printf("Item name: %s\n",CurrentItem->item_name);
             printf("Item state: %s\n",CurrentItem->item_state);
             printf("Item status: %s\n",CurrentItem->item_status);
             printf("Item price: %lf\n",CurrentItem->item_price);
             printf("Item price if debt wasnt paid: %lf\n",CurrentItem->item_price_if_not);
             printf("Issue date: %d/%d/%d\n",CurrentItem->issue_date->day,CurrentItem->issue_date->month,CurrentItem->issue_date->year);
             printf("-----------------------------------------------\n");
             CurrentItem = CurrentItem->next;
             b++;
           }
           current=current->next;
           i++;
        }
    }
//DISPLAY END//
///////////////
int main()
{
    struct client* List = NULL;
         int choice;
         char name[30];
         char client_name[30];
         char client_named[30];
         char client_last_named[30];
          char client_last_name[30];
          char item_name[30];
          char item_state[30];
          char to_find_name[30];
          char to_find_last_name[30];
          double price;
          char status[30];
          double price_if_not;
          int day,month,year;
         scanf( "%d", &choice );
    while( choice != 6)
    {
        printf("Option 1: New person:\nOption 2: Display\nOption 3: Add item to person\n");
    switch( choice )
    {
    case 1:
     printf( "New person: \n" );
                printf("Provide client name\n");
                scanf("%s",client_name);
                printf("Provide client last name\n");
                scanf("%s",client_last_name);
                AddClient(&List,client_name,client_last_name);
                break;
    case 2:
     printf("Display\n");
                Display(List);
                break;
    case 3:
    printf("Add item to person: \n");
    struct client *temporal;
    printf("Name of desired person\n");
      scanf("%s",client_named);
    printf("Last name of desired person\n");
      scanf("%s",client_last_named);
    temporal = FindToAdd(List,client_name,client_last_name);
    printf("Item name\n");
      scanf("%s",item_name);
    printf("Item state\n");
    scanf("%s",item_state);
    printf("Item price\n");
      scanf("%lf",&price);
    printf("Item status\n");
    scanf("%s",status);
    printf("Item price if debt wasnt paid\n");
      scanf("%lf",&price_if_not);
    printf("Issue date: day\n");
    scanf("%d",&day);
    printf("Issue date: month\n");
    scanf("%d",&month);
    printf("Issue date: year\n");
    scanf("%d",&year);
    AddItemToClient(temporal,item_name,item_state,price,status,price_if_not,day,month,year);
    break;
    case 4:
     printf("Name of desired person\n");
      scanf("%s",to_find_name);
    printf("Last name of desired person\n");
      scanf("%s",to_find_last_name);
    FindToAdd(List,to_find_name,to_find_last_name);
    break;
    default:
            printf( "Invalid choice.\n\n" );
            break;
        }

        printf( "? " );
      scanf( "%d", &choice );
    }
}

Dani AI

Generated

Brief note summarising why the later nodes showed “random” dates and a few small fixes to harden the list code.

The most likely causes were (1) uninitialized fields and missing assignments in the else branch that builds a new item (the code allocates the nested date but never assigns day/month/year there) and (2) incorrect traversal that mutates the client’s item_data pointer instead of walking an item * temporary. Both produce undefined memory reads that look like “random” dates. Also the display routine uses head->item_data instead of the current client’s list, so output can show the wrong items for each client.

Practical fixes (apply together):

  • Make AddClient a void function (or return the new pointer). Do not declare it void * and then not return anything.

  • When appending items, traverse with an item * temp, never by modifying a client’s item_data field:

    struct item *tail = head->item_data;
    while (tail->next) tail = tail->next;
    tail->next = new_item;    /* ensure new_item->next = NULL */
  • In Display use current->item_data, not head->item_data, and always check nested pointers before printing:

    struct item *ci = current->item_data;
    while (ci) {
      if (ci->issue_date)
        printf("Issue date: %d/%d/%d\n", ci->issue_date->day, ci->issue_date->month, ci->issue_date->year);
      ci = ci->next;
    }

Safety and debugging tips:

  • Check every malloc return and set next and nested pointers to NULL (or use calloc).
  • Fix the main/case 3 call: pass the variables you read (client_named, client_last_named) to FindToAdd, not the wrong buffers.
  • Use width limits on scanf (for example scanf("%29s", name)) or fgets to avoid overruns.
  • Run under Valgrind to catch uninitialized reads and invalid writes; it will point directly to the offending allocation or missing assignment.

These points complement ’s corrected AddItemToClient and explain why saw proper output for the first node but garbage thereafter.

Recommended Answers

All 2 Replies

Function AddClient() doesn't return anything. Either make it return something or make it a void function. Try this, where I've remove redundent code.

Try this version, where I removed redundent code.

void AddItemToClient(struct client *head, char item_name[30], char item_state[30], double price, char status[30], double price_if_not, int day, int month, int year)
{
    struct item* it = malloc(sizeof(struct item));
    strcpy(it->item_name, item_name);
    strcpy(it->item_state, item_state);
    strcpy(it->item_status, status);
    it->item_price = price;
    it->item_price_if_not = price_if_not;
    it->issue_date = malloc(sizeof(struct date));
    it->issue_date->day = day;
    it->issue_date->month = month;
    it->issue_date->year = year;
    it->next = NULL;
    it->issue_date->next = NULL;

    if (head->item_data == NULL)
    {
        head->item_data = it;
    }
    else
    {
        struct item* node = head->item_data;
        while (node->next) node = node->next;

        node->next = it;
    }
}

It works thanks to code you provided, thanks.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.