数据结构经典题,自学者求解
#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;
}