数据结构-双向链表实现学生录入功能

双向链表实现学生录入功能

在这里插入图片描述
在这里插入图片描述

双向链表实现

#include "stdafx.h"

struct Student
{
	int grade;
	struct Student *next;
	struct Student *back;
};
typedef struct Student Node;
typedef Node* Ptr;

int main()
{
	Ptr head;
	Ptr Creatlink();
	Ptr Show1(Ptr head);
	void Show2(Ptr head);
	head = Creatlink();										//注意三个head的位置  返回第一个结点的地址
	head = Show1(head);									//返回最后一个结点
	Show2(head);												//void不返回
    return 0;
}

Ptr Creatlink()
{
	Ptr head, previous, last;
	int num, i;									//num变量是学生成绩
	//申请第一个节点空间
	head = (Ptr)malloc(sizeof(Node));
	if (head == NULL)
	{
		printf_s("wrong");
		return NULL;
	}
	head->back = NULL;				//第一个结点的back指针赋值为NULL
	previous = head;						//将第一个结点设置为当前结点
	scanf_s("%d", &num);				//获取用户第一次输入的成绩
	while (num != 0)
	{
		previous->grade = num;						//将用户输入的num赋值给当前结点的数据域
		last = (Ptr)malloc(sizeof(Node));
		if (last == NULL)
		{
			printf_s("wrong!");
			return NULL;
		}
		last->back = previous;						//与上一个结点(当前结点)相连,新结点(last)back指针指向当前结点
		previous->next = last;							//上一个结点(当前结点)与新结点(last)链接
		previous = last;										//新结点变为当前结点,准备开辟新结点录入新数据循环上述操作
		scanf_s("%d", &num);							//继续录入成绩 知道满足num=0 退出循环否则一直开辟
	}
	previous = previous->back;					//最后录入的0为无效数据,需要释放,先把当前指针指向倒数第二个结点(第一个是0)
	previous->next = NULL;							//将倒数第二个结点的next指针设为NULL;
	free(last);													//释放最后一个结点,倒数第二个结点next指针也不指向它了,倒数第二成为倒数第一
	return head;												//返回第一个结点的地址
}

Ptr Show1(Ptr head)
{
	Ptr previous;
	printf_s("正向输出:");
	while (head != NULL)
	{
		printf_s("%d\n", head->grade);
		previous = head;
		head = head->next;								//head不断指向下一个结点,知道下一个结点的next指针为NULL(最后一个)循环正向输出
	}
	return previous;										//head=head->next 为NULL  previous指向最后一个结点
}

void Show2(Ptr head)									//同理,但要注意传入参数head的位置不在头结点反而在尾结点
{
	Ptr previous;
	printf_s("反向输出:");
	while (head !=NULL)
	{
		printf_s("%d\n", head->grade);
		previous = head;
		head = head->back;
		free(previous);
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值