基于一个单链表管理数据加一个内核链表管理客户端信息的航班管理系统

单链表管理数据----管理员操作程序

内核链表管理客户/用户端信息

文件IO实现存储录入数据,数据与链表之间可进行相互调用

 进入管理员界面

 用户登录界面

 项目具有一些BUG,为方便缺少一些判断

主函数2.c

#include "myhead.h"
#include "kernel_list.h" 

extern int root_inquire1();
extern int root_add();
extern int root_delete();

//定义一个内核链表
struct airplane
{
    char ID[10];
    //航班号
    char Start_Place[10];
    //城市
    char End_Place[10];
    //城市
    char name[20];
    //名字
    char time[20];
    //时间
    //城市
    float price;
    //价格
    
    struct list_head mypoint;
};

struct airplane *list_init()
{
    struct airplane *head=malloc(sizeof(struct airplane));
    //初始化头结点里面的指针

    INIT_LIST_HEAD(&(head->mypoint));
    return head;
}


//增加票房
int fly_insert(struct airplane*head)
{
    char sometime[20];
    char someStart_Place[20];
    char someEnd_Place[20];    
    char someID[10];
    float someprice;
    
        printf("输入航班ID:");
        scanf("%s", someID);
        printf("输入始发地:");
        scanf("%s", someStart_Place);
        printf("输入目的地:");
        scanf("%s", someEnd_Place);
        printf("输入航班起飞时间:");
        scanf("%s", sometime);
        printf("输入价格:");
        scanf("%f", &someprice);
        printf("添加航班信息完成!\n\n");
        struct airplane*newnode=malloc(sizeof(struct airplane));
        strcpy(newnode->time,sometime);
        strcpy(newnode->Start_Place,someStart_Place);
        strcpy(newnode->End_Place,someEnd_Place);
        newnode->price=someprice;
        strcpy(newnode->ID,someID);
        INIT_LIST_HEAD(&(newnode->mypoint));
        FILE*file=fopen("/mnt/hgfs/share/航班管理系统/1.txt","a+");
        fprintf(file,"编号ID:%s   航线:%s->%s  时间:%s   价格: %f\n",someID,someStart_Place,someEnd_Place,sometime,someprice);
        fclose(file);
        //尾插
        list_add_tail(&(newnode->mypoint),&(head->mypoint));
        return 0;
}

//查询

int inquire(struct airplane*head)
{
    struct airplane*p;
    list_for_each_entry(p,&(head->mypoint),mypoint)
    {
        printf("\n");
        printf("欢迎乘坐钟落潭航班,您已经预定了:航班编号ID:%s 的航班\n",p->ID);
        printf("==============================================================================================\n");
    }
    FILE * adminop = fopen("/mnt/hgfs/share/航班管理系统/1.txt","r+");
    char buf[100]={0};
    //将每个管理员账号密码分配到单独的单链表节点中
    while((fgets(buf,100,adminop))!=NULL)
    {
    printf("%s",buf);
    printf("\n");
    }
}

int root_inquire(struct airplane*head)
{
    struct airplane*p;
    list_for_each_entry(p,&(head->mypoint),mypoint)
    {
        printf("\n");
        printf("您已经添加了:1.航班编号ID:%s 2.时间: %s 3.始发地城市:%s 4.目的地城市:%s  5.价格:%f的航班\n",p->ID,p->time,p->Start_Place, p->End_Place,p->price );
        printf("==============================================================================================\n");
        printf("目前在售航班:\n");
    }
    FILE * adminop = fopen("/mnt/hgfs/share/航班管理系统/1.txt","r+");
    char buf[100]={0};
    //将每个管理员账号密码分配到单独的单链表节点中
    while((fgets(buf,100,adminop))!=NULL)
    {
    printf("%s",buf);
    printf("\n");
    }
}

//删除信息
int delete(struct airplane *head)
{
    char del_ID[20]={0};
    printf("请输入要删除的飞机票编号!\n");
    scanf("%s",del_ID);
    
    //遍历内核链表找到要删除的书籍
    struct airplane *pos,*n;
    //注意:下面这个是for循环,请你不要画蛇添足加上分号
    list_for_each_entry_safe(pos,n,&(head->mypoint),mypoint)
    {
        if(strcmp(pos->ID,del_ID)==0) //找到就删除
        {
            list_del(&(pos->mypoint));
        }
    }
    return 0;
}
int airplane_update(struct airplane *head)
{
    char oldname[20]={0};
    printf("请输入你想修改哪张票的信息,请输入旅客名字!\n");
    scanf("%s",oldname);
    
    struct airplane *pos;
    list_for_each_entry(pos,&(head->mypoint),mypoint)
    {
        if(strcmp(pos->name,oldname)==0)
        {
            printf("输入修改票上编号!\n");
            scanf("%s",pos->ID);
            printf("输入修改票上旅客名字!\n");
            scanf("%s",pos->name);
        }
    }
    return 0;
}

//订票
int BookAirPlane(struct airplane*head)
{
    char newname[20];
    char someID[10];
        printf("输入航班ID:");
        scanf("%s", someID);
        printf("输入名字:");
        scanf("%s", newname);
        printf("预定完成!\n\n");
        struct airplane*newnode1=malloc(sizeof(struct airplane));
        strcpy(newnode1->ID,someID);
        strcpy(newnode1->name,newname);
        INIT_LIST_HEAD(&(newnode1->mypoint));

        //尾插
        list_add_tail(&(newnode1->mypoint),&(head->mypoint));
        return 0;
}

//注册账号密码
int vip_init()
{
    FILE *file1;
    char name[20]={0};
    char passwd[20]={0};
    char buf[100]={0};
    //打开文件
    file1=fopen("/mnt/hgfs/share/航班管理系统/2.txt","a+");
    if(file1==NULL)
    {
        perror("打开文件失败!\n");
        return -1;
    }
        bzero(name,20);
        bzero(passwd,20);
        printf("请输入要注册的用户名!\n");
        scanf("%s",name);    
        if(strcmp(name,"quit")==0)
        {
            printf("推出,已返回登录界面!!\n");
            return -1;        
        }    
        
            printf("请输入要注册的密码!\n");
            scanf("%s",passwd);
            fprintf(file1,"%s@%s\n",name,passwd);
            printf("恭喜您刚才输入的用户名密码注册成功!\n");
            printf("已返回登录界面");
            printf("\n");
            fclose(file1);
            return 0;
}

//判断黑名单用户

int vip_init5(char * name2)
{
    
    FILE *file1;
    file1=fopen("/mnt/hgfs/share/航班管理系统/3.黑名单.txt","r");
    if(file1==NULL)
    {
        perror("打开文件失败balck!\n");
        return -1;
    }
    char buf[20]={0};
    while ((fgets(buf, 20, file1)) != NULL)
    {
        char blackname[20] = {0};
        // 从文件读取的账号密码最后会多个换行符\n
        for (int i = 0; i < strlen(buf) - 1; i++)
        {
           blackname[i]=buf[i];
        }
       if(strcmp(blackname,name2)==0){
           //黑名单检测   
           printf("black\n");
            return -1;
       }
        bzero(buf, 40);
    }

            fclose(file1);
            return 0;
}

//管理员拉黑

            //登录账号
int vip1_init()
{
    FILE *file2;
    char name1[20]={0};
    char passwd1[10]={0};
    char buf[40];
    //打开文件
    file2=fopen("/mnt/hgfs/share/航班管理系统/2.txt","r");

    if(file2==NULL)
    {
        perror("打开文件失败!\n");
        return -1;
    }

    lb:
    printf("请输入用户名和密码登录,输入quit退出!\n");
    scanf("%s%s",name1,passwd1);
    if(strcmp(name1,"quit")==0)
            {
                return -1;
            }
    //判断你输入的用户名是否被占用
    while ((fgets(buf, 40, file2)) != NULL)
    {
        char rightname[20] = {0};
        char rightpwd[15] = {0};
        // 从文件读取的账号密码最后会多个换行符\n
        for (int i = 0, j = 0, flag = 0; i < strlen(buf) - 1; i++)
        {
            if (buf[i] == '@')
            {
                flag = 1;
                continue;
            }
            if (flag == 0)
            {
                rightname[i] = buf[i];
            }
            else
            {
                rightpwd[j++] = buf[i];
            }
        }
       if(strcmp(rightname,name1)==0&&strcmp(rightpwd,passwd1)==0){
           //黑名单检测
           if(vip_init5(name1)==-1)
           {
                printf("你已被拉入黑名单");
                return -1;
           }

            fclose(file2);
            return 0;
       }
        bzero(buf, 40);
    }
    printf("对不起,登录失败\n");
    goto lb;
}
int vip_init6(){
        FILE *file1;
        char name3[20];
        file1=fopen("/mnt/hgfs/share/航班管理系统/3.黑名单.txt","a");
        if(file1==NULL)
        {
            perror("打开文件失败balck!\n");
            return -1;
        }
        printf("请输入要拉黑的用户名!\n");
        scanf("%s",name3);    
        if(strcmp(name3,"quit")==0)
        {
            printf("推出,已返回登录界面!!\n");
            return -1;        
        }    
            sprintf(name3,"%s\n",name3);

            fputs(name3, file1);
            fseek(file1, 0, SEEK_CUR);
            // fprintf(file1,"%s@\n",name3);
            printf("恭喜您刚才输入的用户名成功拉进黑名单!\n");
            printf("已返回登录界面");
            printf("\n");
}
            
int main()
{
        system("clear");
        int a, i, j;
        struct airplane * myhead=list_init();    
        struct airplane *pos;
        lb:
        printf("\n*****************************欢迎进入飞机票务系统*****************************\n");
        printf("\n*************您好,现在要确认您的身份!票务人员请按 1 ,旅客请按 0 ***********\n");
        printf("\n*****************************     新用户注册请按2  ***************************\n");
        printf("\n*****************************     推出程序请按3  *****************************\n");
        scanf("%d", &a);
        system("clear");
        while(1)
        {
        
        if (a == 0)
        {
        if(vip1_init()==-1)
        {goto lb;}
            printf("恭喜您登录成功!\n");
            do{
            printf("\n*********************** 1.订票 **********************\n");
            printf("\n*********************** 2.改签 **********************\n");
            printf("\n*********************** 3.退票 **********************\n");
            printf("\n*********************** 4.浏览航班信息 **************\n");
            printf("\n*********************** 5.查询个人订票信息 **********\n");
            printf("\n*********************** 6.返回登录界面 **************\n");
            printf("\n*********************** 0.退出 **********************\n");
            scanf("%d", &j);
            switch (j)
            {
                case 0:
                return 0;
                break;
                case 1:
                BookAirPlane(myhead);
                break;
                case 2:

                airplane_update(myhead);
                break;
                case 3:
                delete(myhead);
                break;
                case 4: 
                 system("clear");
                inquire(myhead);
                break;
                case 5:
                system("clear");
                list_for_each_entry(pos,&(myhead->mypoint),mypoint)
                {
                    printf("\n");
                    printf("欢迎乘坐钟落潭航班,目前已经订的票编号: %s 旅客:%s \n",pos->ID,pos->name);
                    printf("==============================================================================================\n");
                    
                } break;
                case 6:
                 system("clear");
                goto lb;
                break;
            }
            }while(j!=0);
    }
    //航班管理人员操作
            if (a == 1)
            {
                //printf("请输入管理员账号:");
                char one[20]={"123456"};
                //printf("请输入管理员密码:");
                char two[20]={"123456"};
                char newone[20]={0};
                char newtwo[20]={0};
                printf("请输入账号");
                scanf("%s",newone);
                printf("请输入密码");
                scanf("%s",newtwo);
                if(strcmp(newone,one)==0&&strcmp(newtwo,two)==0)
                {
                do {
                printf("\n*********************** 1.添加航班信息! **********************\n");
                printf("\n*********************** 2.删除航班信息! **********************\n");
                printf("\n*********************** 3.浏览航班信息! **********************\n");
                printf("\n*********************** 4.返回登录界面! **********************\n");
                printf("\n*********************** 5.拉黑用户! **************************\n");
                printf("\n*********************** 0.退出程序!     **********************\n");
                scanf("%d", &i);
                    switch (i)
                    {
                    case 0:
                    return -1;
                    break;
                    case 1:
                    root_add();
                    //fly_insert(myhead);
                    break;
                    case 2:
                    root_delete();
                    break;
                    case 3:
                    system("clear");
                    root_inquire1();
                    break;
                    case 4:
                    system("clear");
                    goto lb;
                    break;
                    case 5:
                    vip_init6();
                    break;
                }
           
            } while (i != 0);
                }else
                {
                printf("输入密码账号不对\n");
                goto lb;
                }
                
        
            //乘客操作
    }    
        if(a==2)
    {
        vip_init();
        goto lb;
    }    
    if(a==3)
    {
        return 0;
    }
    }    
}

========================================================================
单链表文件

4.单链表.c

#include "myhead.h"
//定义一个结构体用来表示单链表
#include "head.h"


int root_add()
{

    //初始化单链表
    struct siglelist *myhead1=list1_init();
    
    root_init1(myhead1);
    char buf[20]={0};

    char root_time[20];
    char root_Start_Place[20];
    char root_End_Place[20];    
    char root_ID[10];
    float root_price;
    
        printf("输入航班ID:");
        scanf("%s", root_ID);
        printf("输入始发地:");
        scanf("%s", root_Start_Place);
        printf("输入目的地:");
        scanf("%s", root_End_Place);
        printf("输入航班起飞时间:");
        scanf("%s", root_time);
        printf("输入价格:");
        scanf("%f", &root_price);
        list_insert1(myhead1,root_ID,root_Start_Place,root_End_Place,root_time,root_price);
        printf("添加航班信息完成!\n\n");
    siglelist1(myhead1);
    list_show1(myhead1); 
    return 0;
    
}


int root_inquire1()
{

    struct siglelist *myhead1=list1_init();
    root_init1(myhead1);
    list_show1(myhead1); 
        
    return 0;
    
}

int root_delete()
{

    //初始化单链表
    struct siglelist *myhead1=list1_init();
    // list_insert(myhead,"1010","广州","北京","12:00",55);
    char buf[20]={0};
    root_init1(myhead1);
    printf("请输入你要删除的航班ID");
    scanf("%s",buf);
    list_delete1(myhead1,buf);
    siglelist1(myhead1);

    list_show1(myhead1); 
    return 0;
    
}

========================================================================

头文件head.c

#include "myhead.h"
//定义一个结构体用来表示单链表
struct siglelist
{
    //数据域--》不是说只有一个数据,可以有多个数据
    char ID[10];
    //航班号
    char Start_Place[10];
    //城市
    char End_Place[10];
    //城市

    char time[20];
    //时间

    float price;
    //价格
    //指针域
    struct siglelist *next; //存放下一个节点在内存中的首地址
};

//单链表的初始化
struct siglelist *list1_init()
{
    //头节点不存放任何有效数据
    struct siglelist *head=malloc(sizeof(struct siglelist));
    head->next=NULL; //暂时不知道后面的数据是谁
    return head;
}
//插入数据--》尾插
int list_insert1(struct siglelist *list,char * ID,char*Start_Place,char *End_Place,char*time,float price)
{    

    struct siglelist *newnode=malloc(sizeof(struct siglelist));
    strcpy(newnode->time,time);
    strcpy(newnode->Start_Place,Start_Place);
    strcpy(newnode->End_Place,End_Place);
    newnode->price=price;
    strcpy(newnode->ID,ID);
    
    newnode->next=NULL;
    struct siglelist *p=list; //指针p指向链表的头
    while(p->next!=NULL)
        p=p->next;  //p往后挪动,循环结束的时候,p指向的就是链表最后面的那个节点
    p->next=newnode;
    return 0;
}

int root_init1(struct siglelist *head)
{
    FILE *commoditop = fopen("/mnt/hgfs/share/航班管理系统/1.txt", "r");
    char buf[50] = {0};
    while ((fgets(buf, 50, commoditop)) != NULL)
    { 
         char sometime[20]={0};
        char someStart_Place[20]={0};
         char someEnd_Place[20]={0};    
         char someID[10]={0};
         float someprice;
        char *p = NULL;
        p = strtok(buf, "-");
        sprintf(someID, "%s", p); 
        p = strtok(NULL, "-");
        sprintf(someStart_Place, "%s", p);
        p = strtok(NULL, "-");
         sprintf(someEnd_Place, "%s", p); 
        p = strtok(NULL, "-");
        sprintf(sometime, "%s", p);
        p = strtok(NULL, "-");
        someprice=atof(p);
        // sprintf(someprice, "%s", p);
       list_insert1(head, someID, someStart_Place, someEnd_Place, sometime,someprice);
        bzero(buf, 50);
    }
}
//查询打印数据
int list_show1(struct siglelist *list)
{
    struct siglelist *p=list; //p指向链表的头节点
    while(p->next!=NULL)
    {
        p=p->next;
        printf("1.航班编号ID:%s  2.始发地城市:%s 3.目的地城市:%s 4.时间: %s 5.价格:%f 的航班\n",p->ID,p->Start_Place, p->End_Place,p->time,p->price );
    }
    return 0;

 }
 int list_delete1(struct siglelist *list,char * someID)
{
    // 定义标志位标记要删除的数据是否存在
    int flag=0;
    // 定义两个指针,一前一后
    struct siglelist *q=list;  //q指向头
    struct siglelist *p=list->next; //p指向头的下一个
    
    // 通过p找到要删除的那个节点
    while(p!=NULL)
    {
        if(strcmp(p->ID,someID)==0) //找到要删除的节点
        {
            q->next=p->next;
            p->next=NULL;
            free(p);
            // 释放p指向的节点以后,程序还需要继续往后找其它的deldata
            p=q->next;
            flag=1;
        }
        else 
        {
            p=p->next;
            q=q->next;
        }
    }
    
    if(flag==0)
    {
        printf("对不起,没有你要删除的数据!\n");
        return -1;
    }
    return 0;

int siglelist1(struct siglelist *head)
//链表头
{
    FILE *op = fopen("/mnt/hgfs/share/航班管理系统/1.txt","w+");
    struct siglelist*p = head;
    while (p->next != NULL)
    {
    p = p->next;
    char buf[100] = {0};
    sprintf(buf, "%s-%s-%s-%s-%f\n", p->ID, p->Start_Place, p->End_Place, p->time,p->price);//每一行写入文件里
    fputs(buf, op);
    fseek(op, 0, SEEK_CUR); 
    // 此句不加,会等程序正常结束才进行写入,若程序异常则不写入
    }
}

=========================================================================

#include "myhead.h"

/*
    把所有常用的头文件都包含进来,方便使用,不需要再去查重复的头文件
*/
#ifndef _MYHEAD_H
#define _MYHEAD_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>
#include <linux/input.h>  //跟输入子系统模型有关的头文件
#include <dirent.h>

#endif

===================================================================

内核链表头文件

#include "kernel_list.h" 

======================================================================

3个txt文档

注意文档光标位置,光标位置不对会产生段错误,把光标依到起点/文档内容删除就行

C语言小试牛刀
关注 关注
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
写文章

热门文章

  • 逻辑门-》与,或,非,异或,同或真值表 3013
  • stm32之16.外设定时器——TIM3 1688
  • stm32之14.超声波测距代码 1577
  • stm32之12.如何使用printf打印输出 1406
  • stm32之22.RTC时钟 1396

最新评论

  • stm32 之20.HC-06蓝牙模块

    苟且泥电: 9 10号引脚为什么会是pin 10 pin 11

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • stm32之31.iic
  • stm32之30.DMA
  • stm32之29.寄存器
2023年57篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源男孩姓金如何起名2018宝宝起名免费水暖电公司起名比较顺口的公司名字公司起名大全美国物价股票软件下载排名2020年首个台风红色预警发布平原峰火店名起名男孩起名字clonnad起名大全男孩带沐字严刑峻法withyouallthetime文人无行马荣成小说网上起名字吗准李姓起男孩名字刘姓高分男孩起名暗粉色霸王大陆单机版拆除公司起什么名字好轮胎公司起名重生霸王龙酒店管理有限公司起名大全怎么起微信名铁臂阿童木电影国语起个好听的游戏名字女商店起名大全一起又看流星雨全集淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化