• windows API 开发飞机订票系统 图形化界面 (三)


    来吧,接下来是各个功能的函数的实现代码。

    首先,程序运行时加载读入账户信息和航班信息。接下来就该读取文件了。

    我把账户资料和航班信息储存在了.txt文件里

    那么问题就来了,挖掘机...额,不对,应该怎么读入账户资料和航班信息?

    每一行是结构体的一个成员,我读入的方式是一行一行读入。 

    两个读入函数代码如下:

     1 //读入账户信息
     2 BOOL ReadAccountData(HWND hwndDlg){                        
     3     
     4     FILE *fp;
     5 
     6     passenger = (Passenger *)malloc(sizeof(Passenger));                                        //为登录账户分配内存
     7     if (!passenger){
     8         MessageBox(hwndDlg, TEXT("内存申请错误!"), TEXT("错误"), MB_OK | MB_ICONERROR);
     9         EndDialog(hwndDlg, 0);
    10         return FALSE;
    11     }//if
    12      
    13     psglink.head = NULL;
    14     psglink.tail = NULL;
    15     psglink.PsgNum = 0;
    16 
    17     if ((fp = fopen(".\AccountData.txt", "r+")) == NULL){        //打开文件
    18         MessageBox(hwndDlg, TEXT("账户文件读入错误!"), TEXT("错误"), MB_OK | MB_ICONERROR);
    19         EndDialog(hwndDlg, 0);
    20     }//if        
    21 
    22     while (!feof(fp)){
    23         Passenger *p = (Passenger *)malloc(sizeof(Passenger));
    24         if (!p){
    25             MessageBox(hwndDlg, TEXT("内存申请错误!"), TEXT("错误"), MB_OK | MB_ICONERROR);
    26             EndDialog(hwndDlg, 0);
    27             return FALSE;
    28         }//if
    29 
    30         //读入账户姓名、身份证号、密码
    31         if (fscanf(fp, "%s%s%s", p->Name, p->IdNum, p->PassWord) == EOF){
    32             free(p); break;
    33         }
    34 
    35         p->Next = NULL;
    36         if (psglink.head == NULL)                        //读入第一个账户信息时,头、尾结点均指向p
    37             psglink.head = p;
    38         else
    39             psglink.tail->Next = p;                        //否则,尾结点Next指向p
    40         psglink.tail = p;                                //尾结点指向p
    41         psglink.PsgNum++;                                //已注册账户个数
    42 
    43     }//while
    44     fclose(fp);                                            //关闭文件
    45     return TRUE;
    46 }//ReadAccountData(HWND)
    47 
    48 
    49 //读入航班信息
    50 BOOL ReadFlightData(HWND hwndDlg){                        
    51 
    52     int flag = 0;
    53     FILE *fp;
    54 
    55     flightlink.Flight_Number = 0;
    56     flightlink.head = NULL;
    57     flightlink.tail = NULL;
    58 
    59     if ((fp = fopen(".\FlightData.txt", "r")) == NULL){        //打开文件
    60         MessageBox(hwndDlg, TEXT("账户文件读入错误!"), TEXT("错误"), MB_OK | MB_ICONERROR);
    61         EndDialog(hwndDlg, 0);
    62     }//if
    63 
    64     while (!feof(fp)){
    65         Flight *p = (Flight *)malloc(sizeof(Flight));
    66         if (!p){
    67             MessageBox(hwndDlg, TEXT("内存申请错误!"), TEXT("错误"), MB_OK | MB_ICONERROR);
    68             EndDialog(hwndDlg, 0);
    69             return FALSE;
    70         }//if
    71         //读入航班信息
    72         if (fscanf(fp, "%s%lf%s%d%d%s%s%s%s%s",
    73             p->Flight_Number,
    74             &p->Fare,
    75             p->Discount,
    76             &p->Seat_Number,
    77             &p->Vacant_Seat,
    78             p->Departure,
    79             p->Destination,
    80             p->Date,
    81             p->TakeOff_Time,
    82             p->Landing_Time) == EOF)
    83         {
    84             free(p);
    85             break;
    86         }
    87         p->Next = NULL;
    88         if (flightlink.head == NULL)                    //添加至链表
    89             flightlink.head = p; 
    90         else
    91             flightlink.tail->Next = p;
    92         flightlink.tail = p;
    93         flightlink.Flight_Number++;
    94 
    95     }//while
    96     fclose(fp);                                            //关闭文件
    97     return TRUE;
    98 }//ReadFlightData()

    因为开发环境是vs2013,所以编译时会报错,报错信息是大体是说fopen()函数不安全,根据提示信息,解决办法是在文件头部做如下定义:

     1 #define _CRT_SECURE_NO_WARNINGS  

    或者是在项目->属性->c/c++->预处理器->预处理器定义,后面加上_CRT_SECURE_NO_WARNINGS就行了。

    结下来又遇到问题了:程序退出把数据写入txt文件时每行末尾都会有一个 ,读入数据的时候用的是feof()函数,而feof()返回的其实是"最后一次读操作的内容",与数据库中的eof()不同,eof()读取的是当前指针位置。因此在读到文件末尾的时候,程序会多执行一次循环,为了防止这种情况,我采取的是检查fscanf()返回值的方法,在此以读入账户资料时为例:

    1 //读入账户姓名、身份证号、密码
    2 if (fscanf(fp, "%s%s%s", p->Name, p->IdNum, p->PassWord) == EOF){
    3     free(p); break;
    4 }

    然后是用户登录或注册时所用到的函数:

     1 //登陆用户验证
     2 BOOL AccountLogIn(HWND hwndDlg){                        
     3     
     4     int flag = 0;                                                                //flag!=0则该用户已注册,flag==0则该用户尚未注册
     5     Passenger *p;
     6 
     7     GetDlgItemText(hwndDlg, IDC_IDEDIT, passenger->IdNum, 256);                    //获取用户输入ID
     8     GetDlgItemText(hwndDlg, IDC_PSWEDIT, passenger->PassWord, 256);                //获取用户输入密码
     9     
    10     p = psglink.head;
    11     while (p){                                                                    //在用户链表查找登陆用户ID
    12         if (!lstrcmp(passenger->IdNum, p->IdNum)){        
    13             flag++;                                                                //该用户已注册
    14             if (!lstrcmp(passenger->PassWord, p->PassWord)){                    //密码匹配,登陆成功
    15                 lstrcpy(passenger->Name, p->Name);
    16                 MessageBox(hwndDlg, TEXT("登陆成功,单击确定进入程序主界面"), TEXT("登陆成功"), MB_OK | MB_ICONINFORMATION);
    17                 break;
    18             }//if
    19             else{                                                                //密码错误,退出循环
    20                 MessageBox(hwndDlg, TEXT("密码错误,请重新输入"), TEXT("密码错误"), MB_OK | MB_ICONERROR);
    21                 return FALSE;
    22             }//else
    23         }//if
    24         p = p->Next;
    25     }//while
    26     if (!flag){                                                                    //用户尚未注册
    27         if (lstrlen(passenger->PassWord)==0)
    28             MessageBox(hwndDlg, TEXT("请输入密码!"), TEXT("信息"), MB_OK | MB_ICONINFORMATION);
    29         else
    30             MessageBox(hwndDlg, TEXT("该账户尚未注册,请先注册"), TEXT("信息"), MB_OK | MB_ICONINFORMATION);
    31     }//if
    32     else{                                                                        //关闭登陆界面,弹出主界面
    33         EndDialog(hwndDlg, TRUE);
    34         if (ReadAccountOrder(hwndDlg, passenger))                                //读取用户订单
    35             DialogBox(hInst, MAKEINTRESOURCE(IDD_MAINDLG), NULL, (DLGPROC)MainDlgProc);
    36     }//else
    37 
    38     return TRUE;
    39 }//AccountLogIn(HWND)
     1 //用户注册
     2 BOOL AccountRegister(HWND hwndDlg){
     3 
     4     GetDlgItemText(hwndDlg, IDC_IDEDIT, passenger->IdNum, 256);            //获取用户输入ID
     5     GetDlgItemText(hwndDlg, IDC_PSWEDIT, passenger->PassWord, 256);        //获取用户输入密码
     6 
     7     if (lstrlen(passenger->PassWord) == 0){
     8         MessageBox(hwndDlg, TEXT("请输入注册用户密码!"), TEXT("信息"), MB_OK | MB_ICONINFORMATION);
     9         return FALSE;
    10     }
    11 
    12     DialogBox(hInst, MAKEINTRESOURCE(IDD_NAMEDLG), NULL, (DLGPROC)NameDlgProc);    //获取新注册用户姓名
    13 
    14     if (lstrlen(passenger->Name) == 0)
    15         return FALSE;
    16 
    17     passenger->Next = NULL;
    18 
    19     if (psglink.head == NULL)                                        //该注册账户为第一个账户时,头、尾结点均指向passenger
    20         psglink.head = passenger;
    21     else
    22         psglink.tail->Next = passenger;                                //将新注册账户资料添加至账户链表
    23     psglink.tail = passenger;                                        //链表尾指针指向链表尾
    24     psglink.PsgNum++;                                                //注册用户数目加1
    25     passenger->TicketNum = 0;                            
    26     passenger->OrderLink.head = NULL;                                //乘客订单链表初始化
    27     passenger->OrderLink.tail = NULL;
    28     passenger->OrderLink.OrderNum = 0;
    29 
    30     MessageBox(hwndDlg, TEXT("注册成功!请单击确定进入主界面"), TEXT("注册成功"), MB_OK | MB_ICONINFORMATION);
    31     
    32     EndDialog(hwndDlg, TRUE);                                                    //关闭登陆界面
    33 
    34     DialogBox(hInst, MAKEINTRESOURCE(IDD_MAINDLG), NULL, (DLGPROC)MainDlgProc); //弹出主界面
    35 
    36     return TRUE;
    37 }//AccountRegister(HWND)

    点击查找、订票、退票、航班录入、修改航班信息按钮都会调用相应的函数。下面来看实现各个功能的代码:

     1 //查找航班
     2 BOOL SearchFlight(HWND hMainDlg){
     3     int flag1 = 0;                                                    //if(flag1==0) 出发地、目的地查询航班,else:航班号查航班
     4     int flag2 = 0;
     5     Flight *p;
     6     TCHAR szBuffer[256] = {TEXT("")};
     7     TCHAR szDeparture[16], szDestination[16], szFltNum[16], szDate[16];
     8 
     9     HWND hEdit = GetDlgItem(hMainDlg, IDC_INFORMATION);
    10 
    11     GetDlgItemText(hMainDlg, IDC_DEPARTURE, szDeparture, 15);        //获取用户输入出发地
    12     GetDlgItemText(hMainDlg, IDC_DESTINATION, szDestination, 15);    //获取用户输入目的地
    13     GetDlgItemText(hMainDlg, IDC_FLIGHTNUM, szFltNum, 15);            //获取用户输入航班号
    14     GetDlgItemText(hMainDlg, IDC_DATE, szDate, 15);                    //获取用户选择航班时间
    15 
    16     SetDlgItemText(hMainDlg, IDC_INFORMATION, szBuffer);            //清空航班信息区域文本
    17     
    18 
    19     if (lstrlen(szFltNum) || (!(lstrlen(szDeparture)) && !(lstrlen(szDestination))))
    20         flag1++;
    21     else if (!(lstrlen(szDeparture))){
    22         MessageBox(hMainDlg, TEXT("请输入出发地!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
    23         return FALSE;
    24     }
    25     else if (!(lstrlen(szDestination))){
    26         MessageBox(hMainDlg, TEXT("请输入目的地!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
    27         return FALSE;
    28     }
    29     if (flag1 && !(lstrlen(szFltNum))){
    30         MessageBox(hMainDlg, TEXT("请输入出发地、目的地或航班号以查询航班!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
    31         return FALSE;
    32     }
    33 
    34     p = flightlink.head;
    35     while (p){                                            //查找航班并输出
    36         if (flag1){                                        //按航班号查找
    37             if (!lstrcmp(p->Flight_Number, szFltNum) && !lstrcmp(p->Date,szDate)){//查找到符合航班,输出
    38                 if (!flag2){                            //若该航班为第一班符合条件的航班
    39                     _stprintf(szBuffer, TEXT("航班号	出发地	目的地	起飞时间	降落时间	余座	价格	折扣	出发日期
    "));
    40                     SendMessage(hEdit, EM_SETSEL, LOWORD(-1), HIWORD(-1));
    41                     SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(szBuffer));
    42                 }//if
    43                 flag2++;
    44                 PrintFlight(hMainDlg, p);                //输出航班信息
    45             }//if
    46         }//if
    47         else{                                            //按出发地、目的地查找
    48             if (!lstrcmp(p->Departure, szDeparture) && !lstrcmp(p->Destination, szDestination) && !lstrcmp(p->Date, szDate)){//查找到符合航班,输出
    49                 if (!flag2){                            //若该航班为第一班符合条件的航班
    50                     _stprintf(szBuffer, TEXT("航班号	出发地	目的地	起飞时间	降落时间	余座	价格	折扣	出发日期
    "));
    51                     SendMessage(hEdit, EM_SETSEL, LOWORD(-1), HIWORD(-1));
    52                     SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(szBuffer));
    53                 }//if
    54                 flag2++;
    55                 PrintFlight(hMainDlg, p);                //输出航班信息
    56             }//if
    57         }//else
    58         p = p->Next;
    59     }//while
    60     if (!flag2)
    61         MessageBox(hMainDlg, TEXT("对不起,没有符合您要求的航班"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
    62     return TRUE;
    63 }//SearchFlight()
     1 //将所查航班信息输出
     2 BOOL PrintFlight(HWND hwndDlg,Flight *p){
     3     TCHAR szBuffer[256];
     4     HWND hEdit = GetDlgItem(hwndDlg, IDC_INFORMATION);
     5 
     6     _stprintf(szBuffer, TEXT("
    %s	%s	%s	%s	%s	%d	%.2lf	%s	%s
    
    "),
     7         p->Flight_Number,                //航班号
     8         p->Departure,                    //出发地
     9         p->Destination,                    //目的地
    10         p->TakeOff_Time,                //起飞时间
    11         p->Landing_Time,                //降落时间
    12         p->Vacant_Seat,                    //余座
    13         p->Fare,                        //价格
    14         p->Discount,                    //折扣
    15         p->Date);                        //出发日期
    16                                         
    17     SendMessage(hEdit, EM_SETSEL, LOWORD(-1), HIWORD(-1));
    18     SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(szBuffer));    
    19 
    20     return TRUE;
    21 }
     1 //订票
     2 BOOL BookTickets(HWND hMainDlg){
     3     int tickets_num;
     4     Flight *p;
     5     TCHAR szFltNum[16], szDate[16];
     6 
     7     GetDlgItemText(hMainDlg, IDC_FLIGHTNUM, szFltNum, 15);            //获取用户输入航班号
     8     GetDlgItemText(hMainDlg, IDC_DATE, szDate, 15);                    //获取用户选择航班时间
     9 
    10     if (!lstrlen(szFltNum)){
    11         MessageBox(hMainDlg, TEXT("请输入航班号以订票!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
    12         return FALSE;
    13     }
    14 
    15     DialogBox(hInst, MAKEINTRESOURCE(IDD_FLTNUM), NULL, (DLGPROC)FlightNumDlgProc);    //获取订票数目
    16 
    17     if (!lstrlen(szBuffer))
    18         return FALSE;
    19 
    20     tickets_num = _ttoi(szBuffer);                                    //订票数目
    21 
    22     p = flightlink.head;
    23     while (p){                                                        //查找航班并订票
    24         if (!lstrcmp(p->Flight_Number, szFltNum) && !lstrcmp(p->Date, szDate))        //查找到符合航班
    25             _Book_Tickets(hMainDlg,p,tickets_num);
    26         p = p->Next;
    27     }//while
    28     return TRUE;
    29 }//BookTickets()     
    30 
    31 
    32 //订票
    33 BOOL _Book_Tickets(HWND hwndDlg,Flight *p,int Tickets_Num){
    34     OrderForm *new_order = (OrderForm *)malloc(sizeof(OrderForm));
    35     if (!new_order){
    36         MessageBox(hwndDlg, TEXT("内存申请错误!"), TEXT("错误"), MB_OK | MB_ICONERROR);
    37         return FALSE;
    38     }
    39 
    40     if (Tickets_Num > p->Vacant_Seat){                    //余票不足,给出建议航班
    41         Recommend(hwndDlg,p,Tickets_Num);
    42         return FALSE;
    43     }
    44 
    45     new_order->Order_Number = ++allorder.AllOrderNum;    //新订单信息,总订单数+1
    46     new_order->Tickets_Num = Tickets_Num;
    47     lstrcpy(new_order->IdNum, passenger->IdNum);
    48     lstrcpy(new_order->Flight_Number, p->Flight_Number);
    49     lstrcpy(new_order->Departure, p->Departure);
    50     lstrcpy(new_order->Destination, p->Destination);
    51     lstrcpy(new_order->Date, p->Date);
    52     lstrcpy(new_order->TakeOff_Time, p->TakeOff_Time);
    53     lstrcpy(new_order->Landing_Time, p->Landing_Time);
    54     new_order->Next = NULL;
    55     new_order->psgNext = NULL;
    56 
    57     if (allorder.head == NULL)                            //将结点添至订单链表末尾
    58         allorder.head = new_order;
    59     else
    60         allorder.tail->Next = new_order;
    61     allorder.tail = new_order;
    62 
    63     if (passenger->OrderLink.head == NULL)                //将结点添至用户订单链表末尾
    64         passenger->OrderLink.head = new_order;
    65     else
    66         passenger->OrderLink.tail->psgNext = new_order;
    67     passenger->OrderLink.tail = new_order;
    68     passenger->OrderLink.OrderNum++;
    69     passenger->TicketNum += Tickets_Num;
    70 
    71     p->Vacant_Seat -= Tickets_Num;                        //航班余票-1
    72 
    73     MessageBox(hwndDlg, TEXT("订票成功!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
    74 
    75     return TRUE;
    76 }//_Book_Tickets()
     1 //给出建议航班
     2 BOOL Recommend(HWND hwndDlg, Flight *p,int Tickets_Num){
     3     SetDlgItemText(hwndDlg, IDC_INFORMATION, TEXT(""));    //清空航班信息栏
     4 
     5     int flag = 0;
     6     TCHAR szBuffer[256] = {TEXT("")};
     7     HWND hEdit = GetDlgItem(hwndDlg, IDC_INFORMATION);
     8     Flight *q;
     9 
    10     q = flightlink.head;
    11     while (q){
    12         if (!(lstrcmp(p->Departure, q->Departure)) && 
    13             !(lstrcmp(p->Destination, q->Destination)) && 
    14             lstrcmp(p->Flight_Number, q->Flight_Number) && 
    15             Tickets_Num<=q->Vacant_Seat)
    16         {
    17             if (!flag){
    18                 wsprintf(szBuffer, TEXT("您所订航班余票不足,以下为建议航班:
    "));
    19                 SendMessage(hEdit, EM_SETSEL, LOWORD(-1), HIWORD(-1));
    20                 SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(szBuffer));
    21                 wsprintf(szBuffer, TEXT("
    "));
    22                 SendMessage(hEdit, EM_SETSEL, LOWORD(-1), HIWORD(-1));
    23                 SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(szBuffer));
    24                 wsprintf(szBuffer, TEXT("航班号	出发地	目的地	起飞时间	降落时间	余座	价格	折扣	出发日期
    "));
    25                 SendMessage(hEdit, EM_SETSEL, LOWORD(-1), HIWORD(-1));
    26                 SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(szBuffer));
    27                 ++flag;
    28             }//if
    29             PrintFlight(hwndDlg, q);
    30         }//if
    31         q = q->Next;
    32     }//while
    33 
    34     if (!flag){
    35         wsprintf(szBuffer, TEXT("对不起,您所订航班余票不足,当天也其它没有符合条件的航班...
    "));
    36         SendMessage(hEdit, EM_SETSEL, LOWORD(-1), HIWORD(-1));
    37         SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)(szBuffer));
    38     }
    39     return TRUE;
    40 }//Recommend()
      1 //退票
      2 BOOL ReturnTickets(HWND hwndDlg){
      3     int flag = 0;
      4     int num=0,tickets_num;
      5     Flight *flight;
      6     OrderForm *p,*q,*s,*prePoint;
      7     TCHAR szFltNum[16], szDate[16];
      8 
      9     GetDlgItemText(hwndDlg, IDC_FLIGHTNUM, szFltNum, 15);        //获取用户输入航班号
     10     GetDlgItemText(hwndDlg, IDC_DATE, szDate, 15);                //获取用户选择航班时间
     11 
     12     if (!lstrlen(szFltNum)){                                    //未输入航班号
     13         MessageBox(hwndDlg, TEXT("请输入航班号!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
     14         return FALSE;
     15     }
     16 
     17     DialogBox(hInst, MAKEINTRESOURCE(IDD_FLTNUM), NULL, (DLGPROC)FlightNumDlgProc);    //获取退票数目
     18 
     19     if (!lstrlen(szBuffer))
     20         return FALSE;
     21 
     22     tickets_num = _ttoi(szBuffer);                                //退票数
     23         
     24     p = passenger->OrderLink.head;
     25     prePoint = p;
     26     if (!p){                                                    //用户无订单
     27         MessageBox(hwndDlg, TEXT("当前用户没有已订票"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
     28         return FALSE;
     29     }
     30     
     31     while (p){                                                    //退票航班订票总数
     32         if (!lstrcmp(p->Flight_Number, szFltNum) && !lstrcmp(p->Date, szDate))
     33             num += p->Tickets_Num;
     34         p = p->psgNext;
     35     }
     36     if (tickets_num > num){                                        //退票数大于该航班已订票数
     37         wsprintf(szBuffer, TEXT("对不起,该航班您只订了%d张机票,请重新填写退票张数"), num);
     38         MessageBox(hwndDlg, szBuffer, TEXT("提示"), MB_OK | MB_ICONINFORMATION);
     39         return FALSE;
     40     }//if
     41 
     42     p = passenger->OrderLink.head;
     43     while (p){                                                    //退票
     44         if (!lstrcmp(p->Flight_Number, szFltNum) && !lstrcmp(p->Date, szDate) ){
     45             if (tickets_num >= p->Tickets_Num){                    //当退票数大于等于当前订单内票数
     46 
     47                 s = p->psgNext;
     48                 passenger->TicketNum -= p->Tickets_Num;            //用户订票数减少
     49                 allorder.AllOrderNum--;                            //总订单数减少
     50                 passenger->OrderLink.OrderNum--;                //用户订单数减少
     51                 tickets_num -= p->Tickets_Num;                    //需要退票数减少  若需要退票数为0,则退出,否则继续循环
     52 
     53                 if (passenger->OrderLink.head == p){            //若p为头结点,删除头结点
     54                     passenger->OrderLink.head = p->psgNext;        //头指针指向下一个结点
     55                     if (!p->psgNext)                            //若p同时为尾结点,则尾指针指向NULL
     56                         passenger->OrderLink.tail = NULL;
     57                 }
     58                 else if (!p->psgNext)                            //若p非头结点但为尾结点,尾指针指向前一个结点
     59                     passenger->OrderLink.tail = prePoint;
     60                 prePoint->psgNext = p->psgNext;                    //链表删除结点p
     61 
     62                 flight = flightlink.head;
     63                 while (flight){                                    //航班余座增加
     64                     if (!lstrcmp(flight->Flight_Number, szFltNum) && !lstrcmp(flight->Date, szDate)){
     65                         flight->Vacant_Seat += p->Tickets_Num;
     66                         break;
     67                     }
     68                     flight = flight->Next;
     69                 }//while
     70 
     71                 q = allorder.head;
     72                 prePoint = q;
     73                 while (q){                                        //删除订单链表中订单结点
     74                     if (q == p){                                //找到订单结点
     75                         if (allorder.head == p){                //若p为头结点,删除头结点
     76                             allorder.head = p->Next;            //头指针指向下一个结点
     77                             if (!q->Next)                        //若q同时为尾结点,则尾指针指向NULL
     78                                 allorder.tail = NULL;
     79                         }
     80                         else if (!q->Next)                        //若q非头结点但为尾结点,尾指针指向前一个结点
     81                             allorder.tail = prePoint;
     82                         prePoint->Next = q->Next;                //链表删除结点q     
     83                         free(p); break;                            //释放p结点内存
     84                     }//if
     85                     prePoint = q;
     86                     q = q->Next;
     87                 }//while
     88 
     89                 if (tickets_num){                                //若退票数非0,则继续退票
     90                     p = s; continue;
     91                 }
     92                     
     93                 MessageBox(hwndDlg, TEXT("退票成功!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
     94                 return TRUE;
     95             }//if
     96             else{                                                //退票数小于该订单订票数
     97                 p->Tickets_Num -= tickets_num;                    //订单订票数减少
     98                 passenger->TicketNum -= tickets_num;            //用户订票数减少
     99 
    100                 flight = flightlink.head;
    101                 while (flight){                                    
    102                     if (!lstrcmp(flight->Flight_Number, szFltNum) && !lstrcmp(flight->Date, szDate)){
    103                         flight->Vacant_Seat += tickets_num;        //航班余票增加
    104                         break;
    105                     }
    106                     flight = flight->Next;
    107                 }//while
    108 
    109                 MessageBox(hwndDlg, TEXT("退票成功!"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
    110                 return TRUE;                                    //退票成功
    111             }//else
    112         }//if
    113         prePoint = p;
    114         p = p->psgNext;
    115     }//while
    116 
    117     wsprintf(szBuffer, TEXT("对不起,您没有订该航班机票,请确认退票航班"));
    118     MessageBox(hwndDlg, szBuffer, TEXT("提示"), MB_OK | MB_ICONINFORMATION);
    119     return FALSE;
    120 }//ReturnTickets()

    这篇文章就先到这里吧,其余功能的实现以及头文件、资源文件的代码在下篇文章中给出。

  • 相关阅读:
    Android编译系统
    Android指针管理:RefBase,SP,WP
    Android图片异步加载
    Android动画学习笔记Android Animation
    触发checkbox的click事件时遇到的问题
    C++ Primer笔记
    Android自定义对话框(Dialog)位置,大小
    android startService流程梳理笔记
    自定义SimpleAdapter
    Android Touch事件
  • 原文地址:https://www.cnblogs.com/z941030/p/4495789.html
Copyright © 2020-2023  润新知