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 );
    }
}

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;
    }
}

Edited 2 Years Ago by Ancient Dragon

It works thanks to code you provided, thanks.

Edited 2 Years Ago by zaxo311

This question has already been answered. Start a new discussion instead.