数据结构-单向链表解决学生录入问题

单向链表实现学生录入程序

将用户输入的不定个数的学生成绩按顺序编号并保存,以用户输入0作为录入结束标志,此时按编号顺序输出各学生录入成绩。

链表##

通过main函数实现一切功能

// 
#include "stdafx.h"						//其中包括了stdio和stdlib   
struct student
{
	int grade;
	struct  student*next;				//指向结构体student类的指针
};										//记一下哈 定义结构体结尾要加分号
										//	定义了一个叫student的结构体,
typedef struct student Node;   			//使用typedef给student声明了别名
typedef Node*  Ptr;						//使用typedef给student结构体指针声明了别名

int main()
{
	int i;
	Ptr head, previous, last;			//定义三个student结构体类型指针    贴心翻译 头,先前,最后
	head = (Ptr)malloc(sizeof(Node));		//申请第一个结点的空间
	if (head == NULL)					//如果申请失败,程序退出
	{
		return -1;
	}
	scanf_s("%d", &head->grade);			//别问我为啥不用scanf,自行百度/滑稽
	previous = head;
	while (1)
	{
		//申请当前最后一个结点的空间
		last = (Ptr)malloc(sizeof(Node));
		if (last == NULL)
		{
			return -1;
		}
		previous->next = last;			//链接结点
		scanf_s("%d", &last->grade);

		if (last->grade == 0)			//如果录入的是0处理掉尾结点之后的结点,将尾节点指针next赋值为NULL
		{
			free(last);
			previous->next = NULL;
			break;
		}
		//如果不是0,previous指针获得当前的地址,last指针继续申请下一个节点空间
		previous = last;
	}

	for ( i = 0; head!=NULL; i++)					//循环输出
	{
		printf_s("第%d个学生的成绩为%d\n", i + 1, head->grade);
		previous = head;							//将输出后的结点地址赋值给previous指针,准备释放该空间
		head = head->next;						//头指针指向下一结点,下一结点成为第一结点
		free(previous);
	}
	
    return 0;var foo = 'bar';

通过调用函数实现

#include "stdafx.h"                          //头文件 不说了

struct student
{
	int grade;
	struct student *next;
};
typedef struct student Node;
typedef Node* Ptr;

Ptr  CreatLinkllist();
void Show(Ptr head);

int main()
{

	Ptr head;
	head = CreatLinkllist();
	Show(head);
	return 0;
}
Ptr CreatLinkllist()
{
	Ptr head, previous, last;
	head = (Ptr)malloc(sizeof(Node));
	if (head == NULL)
	{
		return NULL;
	}
	scanf_s("%d", &head->grade);
	previous = head;
	while (1)
	{
		last = (Ptr)malloc(sizeof(Node));
		if (last == NULL)
		{
			return NULL;
		}
		previous->next = last;
		scanf_s("%d", &last->grade);
		if (last->grade == 0)
		{
			free(last);
			previous->next = NULL;
			break;
		}
		previous = last;
	}
	return head;
}

void Show(Ptr head)
{
	int i;
	Ptr previous;
	for (i = 0; head != NULL; i++)
	{
		printf_s("第%d个学生的成绩是%d\n", i + 1, head->grade);
		previous = head;
		head = head->next;
		free(previous);
	}
}

传送门结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值