Почему этот код C печатает только первый и последний введенный узел? - PullRequest
0 голосов
/ 02 декабря 2009
#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;
  }
}

Ответы [ 3 ]

4 голосов
/ 02 декабря 2009

Вы хотите переместить 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
}
2 голосов
/ 02 декабря 2009

Функция DisplayHotel в порядке! Проблема с функцией createhotel. Когда вы делаете:

while( current->next != NULL ){
  current->next = current->next->next;
}

Здесь вы фактически изменяете список, удаляя элемент. Попробуйте сделать:

while( current->next != NULL ){
  current = current->next;
}

Также наилучшим подходом было бы всегда иметь указатель на последний элемент списка в заголовке, поэтому вы добавляете новые элементы напрямую, а не всегда просматриваете весь список! (не забудьте обновить голову при добавлении нового элемента)

0 голосов
/ 02 декабря 2009

Это неверно:

char * name = (char *) malloc (sizeof (20));

Вы выделяете (sizeof (int)) байты, а не 20 байтов.

Что бы вы ни делали, это вызовет проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...