C语言学习历程(十九) 数据结构完成停车场项目

该博客介绍了使用C语言实现的停车场管理系统,包括创建车辆信息、初始化队列、选择排序和冒泡排序车辆入场、车辆信息出队列、查询及删除车辆等功能。通过结构体和链表管理车辆数据,并使用随机数生成VIP等级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


typedef struct Node
{
    char num[10];                /*定义结构体内容*/
    char name[20];
    int vip;
    struct Node *next;      /*结构体链表*/
}ListNode,*LinkList;        /*定义结构体指针*/


typedef struct 
{
    ListNode data[10];      /*定义队列内容为结构体对象数组*/
    int front;
    int rear;
}SqQueue;


int Srand(int *i)           /*随机数函数,提供vip等级*/
{
    *i = rand()%5;          /*5为随机数范围*/
    return *i;
}


int CreateListCar(LinkList *head)   /*创建车辆信息*/
{
    int i = 2;
    LinkList r,p1;
    (*head) = (LinkList)malloc(sizeof(ListNode));
    (*head) -> next = NULL;         /*头结点为空*/
    r = *head;


    p1 = (LinkList)malloc(sizeof(ListNode)); /*申请动态内存*/


    printf("请输入第1辆车的信息: \n");
    printf("请输入车牌号: ");
    scanf("%s",p1 -> num);  
    printf("请输入车主姓名: ");
    scanf("%s",p1 -> name); 
    p1 -> vip = Srand(&(p1 -> vip));     /*使用随机数函数给vip赋值*/


    while(strcmp(p1 -> num ,"0"))               /*输入结束标志*/
    {
        p1 -> next = r -> next;         /*尾插法插入结点*/
        r -> next = p1;
        r = p1;                         /*每次将r移到最后一个结点*/
        p1 = (LinkList)malloc(sizeof(ListNode));
        printf("请输入第%d辆车的信息: \n",i);
        printf("请输入车牌号: ");
        scanf("%s",p1 -> num);
        printf("请输入车主姓名: ");
        scanf("%s",p1 -> name);
        p1 -> vip = Srand(&(p1 -> vip));
        i ++;
    }
}


int InitQueue(SqQueue *Q)           /*初始化队列函数*/
{
    Q -> front = 0;
    Q -> rear = 0;
    return 1;
}


int PushQueueCar(SqQueue *Q,LinkList head)  /*将链表导入队列*/
{
    LinkList p;
    p = head -> next;
    
    while(p)
    {
        strcpy(Q -> data[Q -> rear].num,p -> num);/*将链表结点信息传入队列*/
        strcpy(Q -> data[Q -> rear].name,p -> name);
        Q -> data[Q -> rear].vip  = p -> vip;
        p = p -> next;  
        Q -> rear ++;           /*每次导入一个结点,将rear+1*/
    }                           /*这里应该将rear-1,但要改下面的,懒得改*/
    printf("入队成功\n");


}


int PopQueueCar(SqQueue *Q)     /*车辆信息出队列函数*/
{
    while(Q -> front < Q -> rear)
    {
        printf("从停车场出来的的车牌号为: %s , 车主为: %s , vip等级为: %d\n",Q -> data[Q -> front].num,Q -> data[Q -> front].name,Q -> data[Q -> front].vip);
        Q -> front ++;          /*队列从一端输出*/
    }
    Q -> front = 0;             /*出完队列后将front置零,便于下次出对*/
    return 0;
}


int SelectSortListCar(LinkList head)    /*选择排序,数组存放结构体指针*/
{
    LinkList s[11],p;        /*结构体链表数组,存放指针,分别指向每个结点*/
    int i,j,min;
    p = head -> next;
    for(i = 1;i < 11 && p != NULL;i++)  /*元素个数等于结点个数*/
    {
        s[i] = p;                       /*存放指针,即结点所在地址*/
        p = p -> next;
    }
    s[i] = NULL;                        /*第i个为空,不然会出错*/
    for(i = 1;i < 10 && s[i] != NULL;i++)   /*选择排序*/
    {
        min = i;                            
        for(j = i+1;j <= 10 && s[j] != NULL;j++)
        {
            if(s[min] -> vip < s[j] -> vip) /*比较vip等级*/
                min = j;            /*交换下标*/
        }
        if(i != min)                /*如果if成立,则i不是当前最大的*/
        {
            s[0] = s[i];
            s[i] = s[min];
            s[min] = s[0];          /*交换的是结点的指针*/
        }                           /*最后数组存放的是排序好的地址指针*/
    }
    for(i = 1;i < 11 && s[i] != NULL;i++)
    {
        printf("第%d辆出来的的车牌号为: %s , 车主为: %s , vip等级为: %d\n",i,s[i] -> num,s[i] -> name,s[i] -> vip);
    } 


}


int BubbleSortListCar(LinkList head)        /*初级冒泡排序*/
{
    int t;
    LinkList p,p1,p2,p3,p4;
    p1 = head -> next;              /*p1用来遍历*/
    p2 = head;                      /*p2更着遍历,但要标志p1的前一位*/
    p = p2;                         /*p用作尾指针插入标志*/
    while(p -> next != NULL)            
    {
        p3 = p1;                    /*每次循环要将p3,p4归位*/
        p4 = p2;
        t = p1 -> vip;              /*t用来存放最大的vip的值*/
        while(p1 != NULL)
        {
            if(p1 -> vip > t)       /*比较出更大的vip*/
            {
                t = p1 -> vip;      
                p3 = p1;            /*将此时的p1,p2所在位置用p3,p4标志*/
                p4 = p2;
            }
                p1 = p1 -> next;    /*每次p1,p2要遍历一遍*/
                p2 = p2 -> next;
        }


        p4 -> next = p3 -> next;    /*将p3所在结点断链*/
        p3 -> next = p -> next;     /*将p3结点接到p后面,使用尾接法*/
        p -> next = p3;
        p = p -> next;              /*将p移到下一个,确保p始终是尾*/
        p1 = p -> next;             /*p1再从下一个结点出发,再次找出t*/
        p2 = p;
    }
    p = head -> next;
    for(t = 1;t < 11 && p != NULL ; t++)
    {
        printf("第%d辆出来的的车牌号为: %s , 车主为: %s , vip等级为: %d\n",t,p -> num,p -> name,p -> vip);
        p = p -> next;
    }
}


int SearchListCar(LinkList head)
{
    char num[10];
    LinkList p;
    p = head -> next;
    printf("请输入你想查询的车牌号:\t");
    scanf("%s",num);


    while(p)                /*遍历到NULL*/
    {
        if(!strcmp(p -> num , num))     /*车牌号相等进入条件*/
        {
            printf("查询到的车牌号为:%s  \n",p -> num);
            printf("查询到的车车主为:%s  \n",p -> name);
            printf("查询到的车vip等级为:%d  \n",p -> vip);
        } 
        p = p -> next;
    }
}


int DeleteListCar(SqQueue *Q,LinkList head)

    int m = 0 ;
    char num[10];
    LinkList p;
    p = head -> next;
    printf("请输入你想删除的车辆的车牌号:");
    scanf("%s",num);
    while(!strcmp(Q -> data[m].num,num) && m < Q -> rear) /*找到所在的结点*/
    {
        m ++;
    }


    strcpy(Q -> data[m].num , "0");          /*将数据归零*/
    strcpy(Q -> data[m].name,"0");
    Q -> data[m].vip = 0;
    m = 0;                  /*m归零,便于下次删除*/
    while(p)
    {
        if(!strcmp(p -> num, num))           /*将链表数据同时归零*/
        {
            strcpy(p -> num , "0");
            strcpy(p -> name,"0");
            p -> vip = 0;
        }
        p = p -> next;
    }


    printf("删除成功\n");
}


int main()
{
    int ch;
    LinkList head;
    SqQueue Q;
    InitQueue(&Q);
    printf("************录入车辆信息  ,请输入1**************\n");
    printf("************由选择排序入场,请输入2**************\n");
    printf("************由冒泡排序入场,请输入3**************\n");
    printf("************由链表进入队列,请输入4**************\n");
    printf("************由队列出停车场,请输入5**************\n");
    printf("************查询车辆信息  ,请输入6**************\n");
    printf("************删除车辆信息  ,请输入7**************\n");
    printf("************退出功能 : 请输入#号键**************\n");
    printf("请输入你想实现的功能:");
    scanf("%d",&ch);


   while(ch != 0)
    {
        switch(ch)
        {
            case 1 : CreateListCar(&head)   ; break;
            case 2 : PushQueueCar(&Q,head)  ; break;
            case 3 : PopQueueCar(&Q)        ; break;
            case 4 : SelectSortListCar(head); break;
            case 5 : BubbleSortListCar(head); break;
            case 6 : SearchListCar(head)    ; break;
            case 7 : DeleteListCar(&Q,head) ; break;
            default  : printf("输入有误\n") ; break;
        }
        printf("请输入你想继续实现的功能:");
        scanf("%d",&ch);
    }


    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值