2014-01-11 3 views
-1

Я пишу программу базы данных для своего класса c в течение нескольких дней сейчас, пытаясь понять, как работать с односвязными списками, довольно трудно понять, я бы сказал, ну, по крайней мере, для меня. В целом, я получил часть кода, необходимого для моего проекта, в основном у меня есть функции для добавления клиента и элементов к клиенту, благодаря помощи кого-то из stackoverflow. Я как-то понял, как добавить несколько элементов к одному клиенту, но теперь мне трудно понять, как точно я могу распечатать его, попытался сделать это так, как вы можете увидеть im мою функцию отображения, но он не работает для элементов, связанных с клиентом, что я должен изменить, чтобы заставить его работать?функция отображения для вложенного отдельного списка c

#include <stdio.h> 
#include <stdlib.h> 
struct item{ 
char item_name[30]; 
struct item *NextItem; 
}; 
struct client{ 
    struct client *NextClient; 
    char name[30]; 
    char last_name[30]; 
    struct item *firstItem; 
    struct item *lastItem; 
}; 
struct client *head = NULL; 
///////////////////////////// 
struct client* FindTailClient(struct client* head) 
{ 
    struct client *temp = head; 
    while(temp->NextClient != NULL) 
    { 

     temp = temp->NextClient; 
    } 
    return temp; 
} 
///////////////////////////// 
//////// 
struct client *GetClientData() 
    { 
     char data[30]; 
    struct client *temp; 
    temp = (struct client*)malloc(sizeof(struct client)); 

    printf("Enter the person's name--->"); 
    scanf("%s",data); 
    strcpy(temp->name,data); 
    printf("Enter the person's last name--->"); 
    scanf("%s",data); 
    strcpy(temp->last_name,data); 
    temp->NextClient = NULL; 
    return temp; 
    } 
/////////// 
struct item *GetItemData() 
    { 
    struct item *temp; 
    char data[30]; 
    temp = (struct item*)malloc(sizeof(struct item)); 

    printf("Enter the item name--->"); 
    scanf("%s",data); 
    strcpy(temp->item_name,data); 
    temp->NextItem = NULL; 
    return temp; 
    } 
/////////// 
////////////// 
struct client* AddClient() 
{ 
    struct client *temp,temp1; 
    temp=head; 
    struct client *data = GetClientData(); 



    if(head == NULL) 
    { 
     head=data; 
     head->NextClient = NULL; 
    } 
    else 
    { 
    while(temp->NextClient != NULL) 
    { 
    temp=temp->NextClient; 
    } 
    data->NextClient=NULL; 
    temp->NextClient=data; 
    } 
} 
/////////////////// 

/////////////////// 

/////////////////// 
void display() 
{ 
    struct client *CurrentClient = head; 
struct item *ItemCurrent = head->firstItem; 
     while(CurrentClient != NULL) 
     { 
     printf(" -> %s ->%s \n",CurrentClient->name,CurrentClient->last_name); 
       while(ItemCurrent != NULL) 
       { 
       printf(" -> %s\n",ItemCurrent->item_name); 
       ItemCurrent=ItemCurrent->NextItem; 
       } 
     CurrentClient=CurrentClient->NextClient; 
     } 

} 
/////////////////// 
void AddItemToClient(struct client* head, struct item *item) 
{ 
    item->NextItem = NULL; 
    if(head->firstItem == NULL) { 
     head->firstItem = item; 
    } else { 
     head->lastItem->NextItem = item; 
    } 
    head->lastItem = item; 

} 
/////////////////// 
struct client *find(struct client *head, char name[]) 
{ 
    while (head->NextClient != NULL) 
    { 
     if (strcmp(head->name,name) == 0) 
     { 
      printf("Target found: %s\n",head->name); 
      return head; 
     } 
     head = head->NextClient; 
    } 
    printf("target not found"); 
    return NULL; 
} 
////////////////// 
int main() 
{ 
    int i; 
    char data[30]; 
    char name[30]; 
    struct client *temp; 
    struct client *head; 
    struct item *data1; 
    for(i=0;i<2;i++) 
    { 
    AddClient(); 
    } 
    printf("Insert name to find:"); 
    scanf("%s",name); 
temp = find(&head,name); 
data1 = GetItemData(); 
AddItemToClient(temp,&data1); 
display(); 
} 
+0

1. Исправьте AddClient, чтобы фактически выполнить возвращаемое значение, обещающее его заявления. 2. Вы передаете указатель на указатель (т. Е. Адрес указателя) на 'find()' (и он не работает), который ожидает только указатель. То же самое верно для 'AddItemToClient (temp, & data1)'. Поднимите предупреждения в своем компиляторе. – WhozCraig

+0

ну в кодовых блоках он компилируется без предупреждения: | – user3175531

+0

Так что, если я прав, мне нужно удалить & из этих двух строк: temp = find (& head, name); AddItemToClient (temp, & data1); как при попытке скомпилировать в dev у меня были предупреждения для тех, и когда я удалил их, не было никакого предупреждения компилировать, но функция find didnt работает вообще после того, как я это сделал, но с теми, с которыми он работал нормально. Указатели меня путают так плохо ..: | – user3175531

ответ

0

В этой строке: "в то время как (ItemCurrent = ItemLast!)" - ItemLast не декларируется. Возможно, вы хотели написать head-> lastItem или лучше ItemCurrent-> next! = NULL. Кроме того, убедитесь, что вы сохранили только что созданные клиенты, чтобы иметь к ним доступ: head = AddClient(); вместо простого AddClient();

+0

забыл изменить его перед публикацией, поскольку пытался выяснить это, он должен был быть ItemCurrent! = NULL в мой код – user3175531

Смежные вопросы