#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char *Name;
int grade;
int cost;
}Hotel; /*This is data element in each node*/
typedef struct hinfo
{
Hotel h;
struct hinfo *next;
}Hinfo; /*This is a single node*/
typedef struct
{
Hinfo *next; /*This is the head pointer of the linked list*/
}HotelHead;
void createHotel(HotelHead *h);
void DisplayHotel(HotelHead h);
int main()
{
HotelHead *list=(HotelHead *)malloc(sizeof(HotelHead));
list->next=NULL;
createHotel(list);
DisplayHotel(*list);
return(0);
}
void createHotel(HotelHead *h) /*This function creates the list of hotels*/
{
char ans='y';
while(ans=='y' || ans=='Y')
{
char *name=(char *)malloc(20*sizeof(char));
Hinfo *new=(Hinfo *)malloc(sizeof(Hinfo));
printf("\nEnter hotel name: ");
scanf("%[A-Za-z0-9 ]",name);
printf("\nEnter hotel grade & cost: ");
scanf("%d %d",&new->h.grade,&new->h.cost);
new->h.Name=name;
new->next=NULL;
if(h->next==NULL){h->next=new;}
else
{
Hinfo *current=h->next;
while(current->next!=NULL){current->next=current->next->next;}
current->next=new;
}
printf("\nEnter another hotel?(Y/N): ");
scanf("%s",&ans);
getchar(); /*dummy getchar to eat unwanted character*/
}
}
void DisplayHotel(HotelHead h) /*This function displays all hotels in the list*/
{
Hinfo *current=h.next;
printf("\nHotel list:\n");
while(current!=NULL)
{
printf("\n%s %d %d\n",current->h.Name,current->h.grade,current->h.cost);
current=current->next;
}
}
ответ
Вы хотите переместить current
во время просмотра списка вместо изменения значения current->next
. Изменить это:
while (current->next != NULL) {
current->next = current->next->next;
}
к этому:
while (current->next != NULL) {
current = current->next;
}
Тем не менее, было бы лучше, чтобы двигаться current
при добавлении новых узлов вместо ходьбы связанный список с самого начала каждый раз. Например (скелетный код):
Hinfo *current;
while (...) {
Hinfo *new = malloc(sizeof(Hinfo));
// initialize new node
if (current != NULL) {
current->next = new;
}
current = new;
// prompt to enter more nodes
}
Функция DisplayHotel в порядке! Проблема заключается в функции createhotel. Когда вы делаете:
while(current->next != NULL){
current->next = current->next->next;
}
Здесь вы на самом деле изменение списка, удаление элемента. Попробуйте сделать:
while(current->next != NULL){
current = current->next;
}
Также лучшим подходом было бы всегда иметь указатель на последний элемент списка на голове, так что вы добавлять новые элементы непосредственно вместо того, чтобы всегда будет кап весь список! (Не забудьте обновить голову, когда вы добавляете новый элемент)
Это неверно:
символ * имя = (символ *) таНос (SizeOf (20));
Вы выделяете (sizeof (int)) байты, а не 20 байтов.
Независимо от того, что еще вы делаете, это вызовет проблемы.
Фактически, sizeof (20) совпадает с sizeof (int), поскольку 20 по умолчанию имеет целочисленный тип, к счастью :) – rmn
Это была точка ответа. sizeof (int) неверен. он хочет 20 символов, которые я предполагаю. – bobDevil
Итак, код должен читать 'char * name = malloc (20);'? Высказывание может сделать здесь более ясным. – mlibby
, пожалуйста, игнорируйте «утечки памяти» на данный момент – 2009-12-02 19:02:18
Когда-либо слышал о кнопке вкладки? – rlbond
Исправлено..отчеты – 2009-12-03 13:01:15