链栈
1. 数据结构定义
typedef struct{
char name[20];
int age;
float score;
}stu;
定义了一个stu
结构体,包含学生的姓名、年龄和分数。
typedef struct node{
stu data;//数据
struct node *next;//指针域
}Node;
定义了一个链表节点结构体Node
,节点包含学生的数据(stu data
)和指向下一个节点的指针(struct node *next
)。
typedef struct{
int len;//长度
Node *top;//指向链栈正常节点
}Stack,*Pstack;
定义了一个栈结构体Stack
,包含栈的长度len
和指向栈顶节点的指针top
。Pstack
是指向Stack
结构体的指针类型。
2. 创建链栈
Pstack creat_stack(){
Pstack p = malloc(sizeof(Stack));
if(p==NULL){
printf("创建头结点失败!\n");
return NULL;
}
p->len = 0;
p->top =NULL;
return p;//返回栈顶节点
}
creat_stack
函数用于创建一个新的链栈。它使用malloc
动态分配内存来存储链栈的结构体。如果内存分配失败,则输出错误信息并返回NULL
。否则,将链栈的长度初始化为0,栈顶指针初始化为NULL
,然后返回栈的指针。
3. 入栈操作
int push_stack(Pstack L, stu e){
if(L==NULL){
printf("链栈不存在\n");
return -1;
}
Node *p = malloc(sizeof(Node));//生成正常节点
p->data = e;
p->next = L->top;
L->top = p;//栈顶指针指向新节点
L->len++;//计数器加1
printf("入栈成功\n");
return 0;
}
push_stack
函数用于将新的元素入栈。首先检查链栈是否存在,如果不存在则返回错误。然后为新节点分配内存,并将传入的stu
数据赋给新节点的data
字段。接着,将新节点插入到链栈的栈顶,更新栈顶指针,并增加栈的长度。最后,输出“入栈成功”信息。
4. 输出栈中所有元素
int output_stack(Pstack L){
Node *t = L->top;
while(t!=NULL){
printf("姓名:%s 年龄:%d 分数:%.2f\n",t->data.name,t->data.age,t->data.score);
t=t->next;
}
printf("\n");
}
output_stack
函数用于输出栈中的所有元素。通过遍历从栈顶到栈底的链表,依次输出每个节点中的学生信息。
5. 出栈操作
int pop_stack(Pstack L){
if(L==NULL||L->len ==0){
printf("站不存在或为空");
return -1;
}
Node *t = L->top;
printf("出栈节点:\n");
printf("姓名:%s 年龄:%d 分数:%.2f\n",t->data.name,t->data.age,t->data.score);
L->top = t->next;
L->len--;
free(t);
t=NULL;
printf("出栈成功\n");
return 0;
}
pop_stack
函数用于出栈操作,首先检查链栈是否存在或为空栈。如果不存在或为空,则输出错误信息并返回错误。然后,将栈顶节点从链栈中移除,输出该节点的信息,更新栈顶指针并减少栈的长度。最后,释放出栈节点的内存并输出“出栈成功”信息。
6. 销毁链栈
int des_stack(Pstack L){
Node *t;
while(t!=NULL){
t=L->top;
L->top = L->top->next;
free(t);
L->len--;
}
free(L);
L=NULL;
printf("销毁成功!\n");
return 0;
}
des_stack
函数用于销毁整个链栈。通过遍历栈中的所有节点,依次释放它们的内存,最后释放链栈结构体本身的内存并将指针置空。
7. 主函数
int main (int argc, const char *argv[])
{
Pstack L = creat_stack();//创建链栈
stu a[4]={{"张三",20,98.5},{"王五",21,87},{"赵六",23,89},{"李四",24,90}};
for(int i=0;i<4;i++){
push_stack(L,a[i]);
}
output_stack(L);
pop_stack(L);
output_stack(L);
des_stack(L);
return 0;
}
主函数中,首先创建一个链栈。然后定义一个包含4个学生信息的数组,并依次将这些学生信息入栈。接着,输出栈中的所有元素,执行一次出栈操作后再次输出栈中的元素,最后销毁链栈并结束程序。