2016-10-17 10 views
1

リンクリストを使用して、cプログラミングで航空会社予約システムを実行しています。それは席を予約し、予約を見て、予約をキャンセルします。このプログラムは、データを追加せずに初めて正常に実行されます。リンクリストを使用した航空会社予約システム

ただし、データを追加して削除すると、ConsoleApplication1.exeの0x0FFAFBB3(ucrtbased.dll)にスローされた例外:0xC0000005:0x0004B000のアクセス違反を書き込むアクセス違反が発生します。

データを削除するには、電話番号データを比較してください。比較すると、レコードが削除されます。しかし、代わりにそれはエラーを与えている。誰でもエラー領域を特定し、提案を提供しますか?

以下は、予約の予約と削除を行うためのコードです。

void new_reservation() 
{ 
    curr = start; 
    if (start == NULL) 
    { 
     //Empty list 
     start = curr = (struct passenger *)malloc(sizeof(struct passenger)); 
     dataentry(); 
     curr->next = NULL; 
     printf("\n\t Reservation successful"); 
     return; 
    } 
    //Reach end of list 


    while (curr->next) 
     curr = curr->next; 
    curr->next = (struct passenger *)malloc(sizeof(struct passenger)); 
    curr = curr->next; 
    dataentry(); 
    curr->next = NULL; 
    printf("\n\t Reservation successful"); 
    printf("\n\t Saved to Reservation list"); 
} 

void del() 
{ 
    struct passenger *temp; // assigning a temporary pointer to struct airplane 
    char str[20]; 
    printf("Enter phone number:"); 

    gets(str); 
    fflush(stdin); 
    curr = start; 
    while (curr) 
    { 
     if (strcmp(start->Phone, str) == 0) 
     { 
      temp = start; 
      start = start->next; 
      free(temp); 
      return; 
     } 
     if (strcmp(curr->next->Phone, str) == 0) 
     { 
      temp = curr->next; 
      curr->next = curr->next->next; 
      free(temp); 
      break; 
     } 
     else if (strcmp(curr->next->Phone, str) != 0) 
     { 
      printf("\n\n No reservations found!!"); 
      break; 
     } 
    } 
    printf("\n\n Deletion successful!!"); 
} 
+1

[ask]を読んでください。 **決して**獲得することは決してありません。それは良い理由のためにもう標準の一部ではありません。また 'fflush(stdin);'は未定義の振る舞いですが、そのように使うことはできません。 – Olaf

+0

'curr-> next'が' NULL'かもしれません。 – BLUEPIXY

+3

問題の発見に役立つデバッガを使用することをお勧めします。デバッガを効果的に使うことを学ぶことは、構築する価値のある技術です。 – kaylum

答えて

1
if (strcmp(start->Phone, str) == 0){...} 
if (strcmp(curr->next->Phone, str) == 0){...} 
else if (strcmp(curr->next->Phone, str) != 0){...} 

この方法では、あなたが慎重にポインタとそのポインタのnextメンバーを確認しない限り、エラーに実行するためにバインドされている、あまりにも複雑です。これを単純化して比較を1つだけ行うことができます。削除されるノードがstartであるか、別のノードである場合は、ノードの位置を常に把握してください。例:

void del() 
{ 
    char str[20]; 
    struct passenger *walk = start; 
    if (!walk) 
     return; 

    printf("Enter phone number:"); 
    scanf("%s", str); 

    struct passenger *previous = 0; 
    while (walk) 
    { 
     if (strcmp(walk->Phone, str) == 0) 
     { 
      struct passenger *next = walk->next; 
      free(walk); 
      if (previous == 0) 
      { 
       //deleting the first item 
       start = next; 
      } 
      else 
      { 
       //deleting an item in middle or end 
       previous->next = next; 
      } 
      return; 
     } 
     previous = walk; 
     walk = walk->next; 
    } 
} 

new_reservationはおそらくエラーの原因にはなりませんが、単純化することもできます。一度だけ割り当ててから最後に挿入するか、startというように割り当てる必要があります。また、scanfを使用して文字列を読み取ることもできます。

void new_reservation() 
{ 
    //create new item 
    curr = malloc(sizeof(struct passenger)); 
    curr->next = NULL; 
    //I don't know this part of your code... 
    dataentry(); 

    if (start == NULL) 
    { 
     //Empty list 
     start = curr; 
    } 
    else 
    { 
     //find the end of the list 
     struct passenger *walk = start; 
     while (walk->next) 
      walk = walk->next; 
     walk->next = curr; 
    } 
} 
関連する問題