数据结构,渡口管理问题,求解

问题遇到的现象和发

数据结构经典题,自学者求解

问题相关代码,请勿粘贴截图
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ERROR 0
#define OK 1

#define maxSize 100     //顺序表的最大长度

typedef struct node {
    int chepai; //车牌
    struct node *next;
} linkqueuenode;     //通讯录中数据元素类型说明

typedef struct {
    linkqueuenode *front;
    linkqueuenode *rear;
} linkqueue;

int EnQueue(linkqueue *q, int x);

int DelNode(linkqueue *q1, linkqueue *q2, linkqueue *q3, int a[]);

int menu_select();  //菜单驱动程序
int OutQueue(linkqueue *q);

int EmptyQueue(linkqueue *p);

int menu_select()   //菜单驱动程序
{
    int sn;
    printf("渡口管理\n");        //显示菜单
    printf("==============================\n");
    printf("1.增加车辆\n");
    printf("2.上船并输出车辆信息\n");
    printf("3.手动开船\n");
    printf("0.退出管理系统\n");
    printf("==============================\n");
    printf("请选择0--3:");

    for (;;)     //菜单功能选择
    {
        scanf("%d", &sn);
        getchar();
        if (sn < 0 || sn > 3)
            printf("\n输入选择错误,请重新选择 0--3:");
        else
            break;
    }
    return sn;
}

/*
    TODO: 新增车辆信息
    功能:新增车辆linkqueuenode类型的结点,并将车辆车牌号x赋值给这个结点,然后将节点插入队列q的末尾,本方法中不需要输出。
    参数:linkqueue *q是要操作的队列,int x是传进来的车牌信息
    返回值:返回1 增加成功,返回0 增加失败(可能原因是:内存分配失败时)。
*/
int EnQueue(linkqueue *q, int x) //增加车辆
{

}

void InsertNode(linkqueue *q1, linkqueue *q2, linkqueue *q3)//进队列
{

    int i, x;
    printf("1:客车 2:鲜货车 3:货车\n");
    scanf("%d", &x);
    printf("请输入车牌号\n");
    scanf("%d", &i);
    if (x > 0 && x <= 3) {
        switch (x) {
            case 1:
                EnQueue(q1, i);
                break;   /*   客车进q1队   */
            case 2:
                EnQueue(q2, i);
                break;   /*   鲜货车进q2队   */
            case 3:
                EnQueue(q3, i);
                break;   /*   普通货车进q2队*/
        }
    } else {
        printf("输入有错!\n");
    }
}

void ChangeNode(linkqueue *q)   //队列初始化
{
    q->front = (linkqueuenode *) malloc(sizeof(linkqueuenode));
    if (q->front != NULL) {
        q->rear = q->front;
        q->front->next = NULL;
    } else {
        printf("有错!");
    }
}

int OutQueue(linkqueue *n)//出对列
{
    int m;
    linkqueuenode *p;
    if (n->front == n->rear)
        return 0;
    p = n->front->next;
    n->front->next = p->next;
    if (n->front->next == NULL) {
        n->rear = n->front;
    }
    if (n->front == p) {
        n->rear = n->front;
    }
    m = p->chepai;
    free(p);
    return m;
}

int EmptyQueue(linkqueue *g) {
    if (g->front == g->rear) {
        return 0;
    } else {
        return 1;
    }
}

/*
    TODO: 上船,并输出车辆信息
    功能说明:从三个队列q1,q2,q3依次读取车辆信息并计数,如果三个队列中车辆总数不满6辆,则输出printf("渡轮上已有%d辆车,准备开船!\n",n),
          变量n为三个队列中车辆数总和,打印后返回0;
         否则,则依次输出6辆车的车牌信息,中间用空格隔开,打印语句为:printf("%d ",a[i]),其中a[i]表示第i-1辆车的车牌号。并返回1

    参数说明:linkqueue *q1是客车队列,linkqueue *q2是鲜货车队列,linkqueue *q3 是货车队列,int a[] 是存储车牌的数组
    返回值:1表示 已经有6辆车了,0表示不满6辆车。
*/
int DelNode(linkqueue *q1, linkqueue *q2, linkqueue *q3, int a[])      //开始上船
{

}

int main(int argc, char *argv[]) {
    linkqueue q1, q2, q3;
    int a[6] = {0, 0, 0, 0, 0, 0};
    int i;
    ChangeNode(&q1);
    ChangeNode(&q2);
    ChangeNode(&q3);

    for (;;) // 无限循环,选择0 退出
    {
        switch (menu_select())    // 调用菜单函数,按返回值选择功能函数
        {
            case 1:
                printf("增加车辆\n");   //建立通讯录顺序表的函数调用
                InsertNode(&q1, &q2, &q3);
                break;
            case 2:

                printf("上船并且输出\n"); //录入通讯者信息的函数调用
                DelNode(&q1, &q2, &q3, a);
                break;
            case 3:
                printf("手动开船\n");
                for (i = 0; i < 5; i++) {
                    if (a[i] == 0) {
                        break;
                    }
                    printf("%d ", a[i]);
                }
                break;
            case 0:
                printf("再见!\n");               //退出系统
                return 0;
        } // switch语句结束 

    } // for循环结束 
    return 0;
}

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果希望一个简便的方法