如何检查c代码链表

时间:2016-06-07 08:49:44

标签: c singly-linked-list

我想在链表中显示座位的可用性,但我不知道chekcavailability()中的逻辑不起作用。

第一个输入没问题,当我输入相同的值时,第二个输入显示座位已被占用并返回到特定功能。

但是当我再次输入可用的不同值时,它会给我一个错误。

请帮助谢谢。

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>

#define A 20

struct passenger
{
char name[20];
char booking_id[20];
char passno[20];
char seatno[20];
struct passenger *next;
}*start,*curr;



void datainput(), savefile(), loadfile(), checkavailability(),   validationseat();

int main()
{
void reserve_seat(), cancel_seat(), modify_seat(), display_layout(), exit();
int choice;
start=curr=NULL;


do
{

    system("cls");
    printf("\n\n*************************************************");
    printf("\n\n********AIRLINE RESERVATION MENU*****************");
    printf("\n\n*************************************************");
    printf("\n\n\t\t* 1. Reserve seat       *");
    printf("\n\n\t\t* 2. Modify seat        *");
    printf("\n\n\t\t* 3. Cancel seat        *");
    printf("\n\n\t\t* 4. Display seat layout*");
    printf("\n\n\t\t* 5. Exit               *");
    printf("\n\n*************************************************");
    printf("\n\n\n\n\t\t Enter your choice: ");
    scanf("%d",&choice);fflush(stdin);
    switch (choice)
    {
    case 1:
        reserve_seat();
        break;

    case 2:
        modify_seat();
        break;

    case 3:
        cancel_seat();
        break;

    case 4:
        display_layout();
        break;
    case 5:
        {
        exit();
        break;
        }
    default:
        printf("invalid choice!!, please try again");
    }
    getch();

}while (choice != 5);

}

void datainput()
{
printf("\n\t\t enter your booking ID: ");
gets(curr->booking_id); fflush(stdin);
printf("\n\t\t enter your seat number: ");
gets(curr->seatno); fflush(stdin);
printf("\n\t\t Enter Name: ");
gets(curr->name); fflush(stdin);
printf("\n\t\t Enter Passport Number: ");
gets(curr->passno); fflush(stdin);

}

void reserve_seat()
{
curr=start;
checkavailability();
if(start==NULL)
    {
        start=curr=(struct passenger *)malloc(sizeof(struct passenger));
        datainput();
        curr->next=NULL;
        printf("\n\t data has been recorded");
        return;
    }
    while(curr->next=NULL)
        curr=curr->next;
    curr->next=(struct passenger *)malloc(sizeof(struct passenger));
    curr=curr->next;
    datainput();
    curr->next=NULL;
    printf("\n\t data has been recorded");

void checkavailability()
{
int i;
char cmp3[20];
printf("select your seat(1-20)");
gets(cmp3);fflush(stdin);
while(curr)
{
    if (strcmp(curr->seatno, cmp3)==0)
    {
        printf("Seat has been taken\n");
        checkavailability();
    }
    else
    {
        break;
    }
}
printf("seat available");
return;
}

1 个答案:

答案 0 :(得分:1)

你的代码有很多错误,最糟糕的是他无法编译(除非conio声明没有参数的退出函数)。

首先,您需要激活一个合适的编译器选项。至少-Wall -Wextra(取决于编译器)。

在主要功能中,这:exit(); 退出函数需要一个参数。解决了这个问题。

modify_seat();
cancel_seat();
display_layout();

这些功能未实现,因此您不应该对它们进行调用。解决这个问题。

不要使用获取!这是危险和不安全的。 不要fflush(stdin)!这是未定义的行为。

“A”定义是无用的,并不是真正明确的。应该是什么? “阵列”?

为了您的安全,请尝试不使用全局变量。 我建议定义一个结构并在main中声明一个变量。

在“reserve_seat”中:  而(curr-&gt;接着= NULL)

你在这里犯了一个错误:它是一会儿(curr-&gt; next!= NULL) 你为curr-> gt分配了NULL,也许这就是你的链表被破坏的原因。

嗯,这对我来说是一个肮脏的代码,因为它严重缺乏严格的编码。 例如,检查函数调用是否失败(如malloc)。 我建议你重写代码。