定义一个包含学生信息的顺序队列和链队列
时间: 2023-05-24 21:05:06 浏览: 227
学生信息包括姓名、学号、性别、年龄、成绩等。假设每个学生信息用一个结构体来存储。
顺序队列是一种利用数组实现的队列结构。定义一个包含学生信息的顺序队列,可以使用如下的结构体:
```
#define MAXSIZE 100 // 数组容量
typedef struct {
char name[20]; // 学生姓名
int id; // 学生学号
char gender; // 学生性别
int age; // 学生年龄
float score; // 学生成绩
} Student; // 学生信息结构体
typedef struct {
Student data[MAXSIZE]; // 数组存储学生信息
int front; // 队头指针
int rear; // 队尾指针
} SqQueue; // 顺序队列结构体
```
链队列是一种利用链表实现的队列结构。定义一个包含学生信息的链队列,可以使用如下的结构体:
```
typedef struct QNode {
Student data; // 学生信息结构体
struct QNode *next; // 队列指针
} QNode, *QueuePtr; // 队列结点和队列指针结构体
typedef struct {
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
} LinkQueue; // 链队列结构体
```
相关问题
定义一个包含学生信息的顺序队列和链队列代码
顺序队列的代码实现:
```python
class SeqQueue:
def __init__(self, capacity):
self.capacity = capacity # 队列的最大容量
self.front = 0 # 队头指针
self.rear = 0 # 队尾指针
self.data = [None] * capacity # 队列数组
def is_empty(self):
return self.front == self.rear
def is_full(self):
return (self.rear + 1) % self.capacity == self.front
def enqueue(self, value):
if self.is_full():
return False
self.data[self.rear] = value # 将元素插入队尾
self.rear = (self.rear + 1) % self.capacity # 更新队尾指针
return True
def dequeue(self):
if self.is_empty():
return None
value = self.data[self.front] # 取出队头元素
self.front = (self.front + 1) % self.capacity # 更新队头指针
return value
```
链队列的代码实现:
```python
class Node:
def __init__(self, value=None, next=None):
self.value = value # 节点的值
self.next = next # 指向下一个节点的指针
class LinkQueue:
def __init__(self):
self.front = self.rear = Node() # 哨兵节点
def is_empty(self):
return self.front == self.rear
def enqueue(self, value):
self.rear.next = Node(value) # 创建新节点
self.rear = self.rear.next # 更新队尾指针
def dequeue(self):
if self.is_empty():
return None
value = self.front.next.value # 取出队头元素
self.front.next = self.front.next.next # 更新队头指针
if self.front.next is None: # 队列为空时,更新队尾指针
self.rear = self.front
return value
```
(数据结构)利用 C语言实现顺序队列及链队列定义一个包含学生信息(学号,姓名,成绩)的顺序队列和链队列,使其具有如下功能: (1) 初始化一个空队列; (2) 逐个输入学生信息并入队; (3) 出队,输出学号、姓名、成绩等信息; (4) 删除队列。 (5) 统计当前队列排队学生个数;
顺序队列的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
typedef struct {
char id[20];
char name[20];
int score;
} Student;
typedef struct {
Student data[MAXSIZE];
int front, rear;
} SeqQueue;
void InitQueue(SeqQueue *Q)
{
Q->front = Q->rear = 0;
}
int QueueLength(SeqQueue Q)
{
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
int Enqueue(SeqQueue *Q, Student stu)
{
if ((Q->rear + 1) % MAXSIZE == Q->front) {
// 队列已满
return 0;
}
Q->data[Q->rear] = stu;
Q->rear = (Q->rear + 1) % MAXSIZE;
return 1;
}
int Dequeue(SeqQueue *Q, Student *stu)
{
if (Q->front == Q->rear) {
// 队列为空
return 0;
}
*stu = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
return 1;
}
void DestroyQueue(SeqQueue *Q)
{
Q->front = Q->rear = 0;
}
int main()
{
int n = 0, i = 0;
SeqQueue Q;
Student stu;
InitQueue(&Q);
printf("请输入学生人数:");
scanf("%d", &n);
printf("请逐个输入学生信息(学号、姓名、成绩):\n");
for (i = 0; i < n; i++) {
printf("第 %d 个学生:", i + 1);
scanf("%s %s %d", stu.id, stu.name, &stu.score);
if (!Enqueue(&Q, stu)) {
printf("队列已满,无法插入!\n");
break;
}
}
printf("\n当前队列中有 %d 个学生:\n", QueueLength(Q));
while (Dequeue(&Q, &stu)) {
printf("学号:%s,姓名:%s,成绩:%d\n", stu.id, stu.name, stu.score);
}
DestroyQueue(&Q);
return 0;
}
```
链队列的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
char id[20];
char name[20];
int score;
struct Node *next;
} Student;
typedef struct {
Student *front, *rear;
} LinkQueue;
void InitQueue(LinkQueue *Q)
{
Q->front = Q->rear = (Student*)malloc(sizeof(Student));
if (!Q->front) {
printf("内存分配失败!\n");
exit(1);
}
Q->front->next = NULL;
}
int QueueLength(LinkQueue Q)
{
Student *p = Q.front->next;
int len = 0;
while (p) {
len++;
p = p->next;
}
return len;
}
int Enqueue(LinkQueue *Q, Student stu)
{
Student *newNode;
newNode = (Student*)malloc(sizeof(Student));
if (!newNode) {
printf("内存分配失败!\n");
exit(1);
}
newNode->score = stu.score;
strcpy(newNode->id, stu.id);
strcpy(newNode->name, stu.name);
newNode->next = NULL;
Q->rear->next = newNode;
Q->rear = newNode;
return 1;
}
int Dequeue(LinkQueue *Q, Student *stu)
{
Student *p;
if (Q->front == Q->rear) {
// 队列为空
return 0;
}
p = Q->front->next;
Q->front->next = p->next;
if (Q->rear == p) {
// 若被删的是队尾结点,则修改队尾指针
Q->rear = Q->front;
}
*stu = *p;
free(p);
return 1;
}
void DestroyQueue(LinkQueue *Q)
{
Student *p = Q->front, *q;
while (p) {
q = p->next;
free(p);
p = q;
}
Q->front = Q->rear = NULL;
}
int main()
{
int n = 0, i = 0;
LinkQueue Q;
Student stu;
InitQueue(&Q);
printf("请输入学生人数:");
scanf("%d", &n);
printf("请逐个输入学生信息(学号、姓名、成绩):\n");
for (i = 0; i < n; i++) {
printf("第 %d 个学生:", i + 1);
scanf("%s %s %d", stu.id, stu.name, &stu.score);
if (!Enqueue(&Q, stu)) {
printf("内存分配失败,无法插入!\n");
break;
}
}
printf("\n当前队列中有 %d 个学生:\n", QueueLength(Q));
while (Dequeue(&Q, &stu)) {
printf("学号:%s,姓名:%s,成绩:%d\n", stu.id, stu.name, stu.score);
}
DestroyQueue(&Q);
return 0;
}
```
阅读全文