用C语言链表设计一个航班管理系统实现航班的增删改查和排序
时间: 2024-05-06 15:18:00 浏览: 10
好的,下面为您提供一个简单的航班管理系统的链表实现,包括航班信息的增删改查和排序功能。
首先,我们需要定义航班信息的结构体:
```c
typedef struct Flight {
char flightNo[10]; // 航班号
char startCity[20]; // 起始城市
char endCity[20]; // 目的城市
char departureTime[20]; // 出发时间
char arrivalTime[20]; // 到达时间
struct Flight* next; // 指向下一个节点的指针
} Flight;
```
接下来,我们定义一些基本操作函数:
1. 创建一个新节点
```c
Flight* createNode(char* flightNo, char* startCity, char* endCity, char* departureTime, char* arrivalTime) {
Flight* node = (Flight*)malloc(sizeof(Flight));
strcpy(node->flightNo, flightNo);
strcpy(node->startCity, startCity);
strcpy(node->endCity, endCity);
strcpy(node->departureTime, departureTime);
strcpy(node->arrivalTime, arrivalTime);
node->next = NULL;
return node;
}
```
2. 插入节点到链表尾部
```c
void insertNode(Flight** head, Flight* node) {
if (*head == NULL) {
*head = node;
} else {
Flight* cur = *head;
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = node;
}
}
```
3. 删除节点
```c
void deleteNode(Flight** head, char* flightNo) {
Flight* cur = *head;
Flight* pre = NULL;
while (cur != NULL) {
if (strcmp(cur->flightNo, flightNo) == 0) {
if (pre == NULL) {
*head = cur->next;
} else {
pre->next = cur->next;
}
free(cur);
return;
}
pre = cur;
cur = cur->next;
}
}
```
4. 修改节点
```c
void modifyNode(Flight** head, char* flightNo, char* startCity, char* endCity, char* departureTime, char* arrivalTime) {
Flight* cur = *head;
while (cur != NULL) {
if (strcmp(cur->flightNo, flightNo) == 0) {
strcpy(cur->startCity, startCity);
strcpy(cur->endCity, endCity);
strcpy(cur->departureTime, departureTime);
strcpy(cur->arrivalTime, arrivalTime);
return;
}
cur = cur->next;
}
}
```
5. 查找节点
```c
Flight* findNode(Flight* head, char* flightNo) {
Flight* cur = head;
while (cur != NULL) {
if (strcmp(cur->flightNo, flightNo) == 0) {
return cur;
}
cur = cur->next;
}
return NULL;
}
```
6. 排序节点
我们可以按照航班号或者出发时间进行排序。这里给出按照航班号排序的实现:
```c
void sortNodeByFlightNo(Flight** head) {
if (*head == NULL || (*head)->next == NULL) {
return;
}
Flight* cur = *head;
Flight* pre = NULL;
int flag;
do {
flag = 0;
cur = *head;
while (cur->next != pre) {
if (strcmp(cur->flightNo, cur->next->flightNo) > 0) {
Flight* tmp = cur->next;
cur->next = tmp->next;
tmp->next = cur;
if (pre == NULL) {
*head = tmp;
} else {
pre->next = tmp;
}
pre = tmp;
flag = 1;
} else {
pre = cur;
cur = cur->next;
}
}
} while (flag);
}
```
最后是主函数,实现对航班信息的增删改查和排序:
```c
int main() {
Flight* head = NULL;
insertNode(&head, createNode("CZ001", "北京", "上海", "2022-01-01 08:00", "2022-01-01 10:00"));
insertNode(&head, createNode("MU002", "上海", "广州", "2022-01-02 09:00", "2022-01-02 12:00"));
insertNode(&head, createNode("CA003", "北京", "广州", "2022-01-03 10:00", "2022-01-03 13:00"));
insertNode(&head, createNode("HU004", "广州", "北京", "2022-01-04 11:00", "2022-01-04 14:00"));
printf("航班信息如下:\n");
Flight* cur = head;
while (cur != NULL) {
printf("%s %s->%s %s->%s\n", cur->flightNo, cur->startCity, cur->endCity, cur->departureTime, cur->arrivalTime);
cur = cur->next;
}
printf("\n删除航班:CA003\n");
deleteNode(&head, "CA003");
cur = head;
while (cur != NULL) {
printf("%s %s->%s %s->%s\n", cur->flightNo, cur->startCity, cur->endCity, cur->departureTime, cur->arrivalTime);
cur = cur->next;
}
printf("\n修改航班:HU004\n");
modifyNode(&head, "HU004", "广州", "北京", "2022-01-04 11:30", "2022-01-04 14:30");
cur = head;
while (cur != NULL) {
printf("%s %s->%s %s->%s\n", cur->flightNo, cur->startCity, cur->endCity, cur->departureTime, cur->arrivalTime);
cur = cur->next;
}
printf("\n查找航班:CZ001\n");
Flight* node = findNode(head, "CZ001");
if (node != NULL) {
printf("%s %s->%s %s->%s\n", node->flightNo, node->startCity, node->endCity, node->departureTime, node->arrivalTime);
} else {
printf("未找到该航班!\n");
}
printf("\n按照航班号排序:\n");
sortNodeByFlightNo(&head);
cur = head;
while (cur != NULL) {
printf("%s %s->%s %s->%s\n", cur->flightNo, cur->startCity, cur->endCity, cur->departureTime, cur->arrivalTime);
cur = cur->next;
}
return 0;
}
```
注意,在实际应用中,我们需要对输入的参数进行校验,防止输入非法参数导致程序崩溃。