1、建立学生信息结构体,将data改为学生信息结构体类型。
2、循环入栈和入队。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct {
int age; // 学生年龄
int score; // 学生成绩
char name[50]; // 学生姓名
} stu;
// 定义链栈节点结构体
typedef struct node {
stu data; // 节点数据,类型为学生结构体
struct node *next; // 指向下一个节点的指针
} node;
// 定义链栈结构体
typedef struct {
int len; // 栈的长度,即当前栈中元素的个数
node *top; // 指向栈顶节点的指针
} stack, *pstack;
// 创建一个空的链栈
pstack creatstack() {
pstack p = malloc(sizeof(stack)); // 为栈分配内存
if (p == NULL) { // 检查内存分配是否成功
printf("创建失败\n");
return NULL; // 内存分配失败,返回 NULL
}
p->len = 0; // 初始化栈的长度为 0
p->top = NULL; // 初始化栈顶指针为 NULL
return p; // 返回新创建的栈
}
// 将一个学生信息压入栈顶
int pushstack(pstack l, stu e) {
if (l == NULL) { // 检查栈是否存在
printf("链栈不存在\n");
return -1; // 栈不存在,返回错误代码
}
node *p = malloc(sizeof(node)); // 为新节点分配内存
if (p == NULL) { // 检查内存分配是否成功
printf("节点分配失败\n");
return -1; // 内存分配失败,返回错误代码
}
p->data = e; // 设置节点的数据
p->next = l->top; // 新节点指向当前栈顶
l->top = p; // 更新栈顶指针指向新节点
l->len++; // 增加栈的长度
return 0; // 成功入栈,返回 0
}
// 输出栈中所有元素
int output(pstack l) {
if (l == NULL || l->len == 0) { // 检查栈是否存在以及是否为空
printf("栈为空或不存在\n");
return -1; // 栈为空或不存在,返回错误代码
}
node *t = l->top; // 从栈顶开始遍历
for (int i = 0; i < l->len; i++) {
printf("%d\t%d\t%s\n", t->data.age, t->data.score, t->data.name); // 打印当前节点的数据
t = t->next; // 移动到下一个节点
}
return 0; // 成功输出栈内容,返回 0
}
// 主函数
int main(int argc, const char *argv[]) {
// 初始化学生数据
stu st[4] = {{20, 80, "A"}, {20, 90, "B"}, {20, 90, "C"}, {20, 98, "D"}};
pstack l = creatstack(); // 创建一个空的链栈
if (l == NULL) {
return -1; // 创建栈失败,退出程序
}
for (int i = 0; i < 4; i++) {
pushstack(l, st[i]); // 将学生信息逐个压入栈中
}
output(l); // 输出栈中所有元素
return 0; // 程序正常结束
}