数据结构课程设计报告
航班信息管理系统
一、需求分析
问题描述:航班信息管理系统的业务活动包括:航班信息的添加和删除、指定航班的条件查询及所有航班的全部查询等,需对指定内容进行分析设计利用计算机加以实现。
每条航线所涉及的信息有:航班号、飞机号、出发地、到达地、飞行日期、机型和票余量。每个客户所涉及的信息有:姓名、手机号、航班号和订票量。
系统能够实现的功能与操作如下:
1.航班信息的添加:根据用户依次输入的内容(航班号、飞机号、出发地、到达地、飞行日期、机型和票余量),对所需添加的航线与已有航线进行比对添加(如出现相同航班号则无法添加)。
2.航班信息的删除:根据用户输入的航班号进行比对删除(有此航线则删除,没有则警示)。
3.指定航班的条件查询:根据用户输入的航班号进行条件查询。
4.所有航班的全部查询:显示所有航线所有信息。
选做内容:客户退订票功能,内有客户订票和退票、所有订票客户信息查询等。根据客户订票量会相应对航班票余量进行修改。
输出界面:有主菜单、分菜单可对上述所说2和3内容进行用户的相应选择和呈现,以达到系统的交互性。
编译环境:win10;eclipse;
所使用的编译语言:Java语言
二、系统功能划分及设计
1.存储结构设计
系统存储结构设计采用链式存储结构,将所有航线存储到一个链表中,对于航线的插入和删除操作运算方便。同理,将每条航线的各个数据项、客户订票信息分别存储到另外的链表中加以操作。
2.系统的功能架构设计
系统功能架构流程设计如图所示,主函数调用菜单函数进行菜单选择(1-4)。
- 当用户选择1时,调用航班信息管理菜单选择(1-3),1代表添加航班信息操作,2代表删除航班信息操作,3代表返回主菜单。
- 当用户选择2时,调用查询航班菜单选择(1-3),1代表根据航班号查询航线信息,2代表查询所有航班信息,3代表返回主菜单。
- 当用户选择3时,调用航班退订票菜单选择(1-4),1代表为客户办理航线订票服务,2代表查询所有客户订票信息,3代表为客户办理航线退票服务,4返回主菜单。
- 退出系统。
3.模块设计
如上图所示为系统所涉及到各类的属性、方法及各类之间的关系图。
3.代码实现
public class Node<T> {
T data; // 数据域
Node<T> next; //指针域
public Node(Node<T> n){
next=n;
}
public Node(T obj,Node<T> n){
data=obj;
next=n;
}
public T getData( ){
return data;}
public Node<T> getNext( ){
return next;}
}
public class LinkList<T> {
private Node<T> head; // 头指针
private int length; // 长度
public LinkList() {
// 构造一个空的链表
length = 0;
head = new Node<T>(null);
}
public Node<T> getHead() {
// 获取链表头结点地址
return head;
}
public boolean isEmpty() {
// 判空
return length == 0;
}
public int size() {
// 求链表长度即数据元素个数
return length;
}
public boolean add(T obj, int pos) {
// 在链表中插入一个新元素
if ((pos < 1 || pos > length + 1)) {
return false; // pos值不正确
}
int num = 1;
Node<T> p = head, q = head.next;
while (num < pos) {
p = q;
q = q.next;
num++;
}
p.next = new Node<T>(obj, q);
length++;
return true;
}
public T remove(int pos) {
// 删除链表中的某个元素
if (isEmpty()) {
System.out.println("链表为空表");
return null;
} else {
if ((pos < 1 || pos > length + 1)) {
System.out.println("pos值不合法");
return null;
}
int num = 1;
Node<T> p = head, q = head.next;
while (num < pos) {
p = q;
q = q.next;
num++;
}
p.next = q.next;
length--;
return q.data;
}
}
public int find(T obj) {
if (isEmpty()) {
System.out.println("链表为空表");
return -1;
}
int num = 1;
Node<T> p = head.next; // p引用的是头结点之后的结点
while (p != null) {
// 单链表的判空条件
if (p.data.equals(obj) == false) {
// equals判断两个对象值是否相等
p = p.next;
num++;
} else
break;
}
if (p == null)
return -1;
return num;
}
public T value(int pos) {
// 获取链表中的一个元素
if (isEmpty()) {
System.out.println("链表为空表");
return null;
} else {
if ((pos < 1 || pos > length + 1)) {
System.out.println("pos值不合法");
return null;
}
int num = 1;
Node<T> q = head.next;
while (num < pos) {
q = q.next;
num++;
}
return q.data;
}
}
public boolean modify(T obj, int pos) {
// 更新链表中的某个元素
if (isEmpty()) {
System.out.println("链表为空表");
return false;
} else {
if ((pos < 1 || pos > length + 1)) {
System.out.println(