定义一个包含学生信息的链队列,使其具有以下功能:1.初始化一个空队列,2.诸葛输入学生信息并入队,3.出队,4.删除队列,5统计当前队列排队学生个数,6.设计一个绿色通道
时间: 2023-05-27 14:03:31 浏览: 104
1_lower7y7_定义一个包含学生信息(学号_成绩)的顺序表和链表(二选一)_姓名_使其具有如下功能_
5星 · 资源好评率100%
1. 定义链队列的结构体
```
typedef struct student{
char name[20]; // 学生姓名
int age; // 学生年龄
char gender[10]; // 学生性别
char major[20]; // 学生专业
struct student *next;
} Student;
typedef struct queue{
int count; // 队列中学生个数
Student *front; // 队头指针
Student *rear; // 队尾指针
} Queue;
```
2. 初始化一个空队列
```
void initQueue(Queue *q){
q->count = 0; // 学生个数初始化为0
q->front = NULL;
q->rear = NULL;
}
```
3. 输入学生信息并入队
```
void enqueue(Queue *q, char *name, int age, char *gender, char *major){
Student *newStu = (Student*)malloc(sizeof(Student));
if(newStu == NULL){
printf("内存分配失败!\n");
return;
}
strcpy(newStu->name, name); // 把学生信息存入新学生节点的数据域中
newStu->age = age;
strcpy(newStu->gender, gender);
strcpy(newStu->major, major);
newStu->next = NULL;
if(q->rear != NULL){ // 队列非空时
q->rear->next = newStu; // 把新节点加入队尾
q->rear = newStu; // 更新队尾指针
}else{ // 队列为空时
q->front = newStu; // 新节点既是队头也是队尾
q->rear = newStu;
}
q->count++; // 对列中学生个数加1
}
```
4. 出队
```
void dequeue(Queue *q){
if(q->front == NULL){ // 队列为空
printf("队列为空,无法出队!\n");
return;
}
Student *temp = q->front; // 创建临时指针,指向队头节点
q->front = q->front->next; // 指向队头的指针指向队头节点的下一个节点
if(q->front == NULL){ // 队列中只有一个节点时,出队后队列为空
q->rear = NULL;
}
printf("出队学生信息:\n姓名:%s\n年龄:%d\n性别:%s\n专业:%s\n", temp->name, temp->age, temp->gender, temp->major);
free(temp); // 释放空间
q->count--; // 队列中学生个数减1
}
```
5. 删除队列
```
void deleteQueue(Queue *q){
while(q->front != NULL){ // 循环删除队列中的每一个节点
dequeue(q);
}
printf("队列删除成功!\n");
}
```
6. 统计当前队列排队学生个数
```
void countQueue(Queue *q){
printf("当前队列排队学生个数:%d\n", q->count);
}
```
7. 设计一个绿色通道
```
void greenChannel(Queue *q, char *name){
Student *temp = q->front;
Student *pre = NULL;
while(temp != NULL){ // 循环遍历队列
if(strcmp(temp->name, name) == 0){ // 找到指定学生
if(temp == q->front){ // 指定学生在队头
q->front = temp->next; // 更新队头指针
}else if(temp == q->rear){ // 指定学生在队尾
pre->next = NULL; // 更新队尾指针
q->rear = pre;
}else{ // 指定学生在队列中间
pre->next = temp->next; // 使指定学生的前一节点指向指定学生的后一节点
}
printf("通过绿色通道出队学生信息:\n姓名:%s\n年龄:%d\n性别:%s\n专业:%s\n", temp->name, temp->age, temp->gender, temp->major);
free(temp); // 释放指定学生所在节点的空间
q->count--; // 队列中学生个数减1
return;
}
pre = temp; // pre指针指向temp指针所指节点的前一节点
temp = temp->next; // temp指针指向下一节点
}
printf("队列中没有找到指定学生:%s\n", name);
}
```
阅读全文