8.13练习(链栈)

链栈

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和指向栈顶节点的指针topPstack是指向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个学生信息的数组,并依次将这些学生信息入栈。接着,输出栈中的所有元素,执行一次出栈操作后再次输出栈中的元素,最后销毁链栈并结束程序。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值