单链表的创建及插入与删除

       在使用C语言创建学生成绩管理系统时,需要使用链表来进行信息的管理。通常情况下我们可以使用单链表来实现,单链表是一种链式存储的数据结构。链表中的数据是以节点来表示的。每个节点均包含两部分内容,数据和指向下一节点的指针。在创建链表是应进行动态内存申请,使用malloc函数获取。插入时我们选择头插法来保存数据。下边内容为代码演示

#define _CRT_SECURE_NO_WARNINGS

#include<stdlib.h>
#include<stdio.h>
#include<conio.h>

/*创建学生信息结构体*/
typedef struct _Student
{
	char cName[20];											//姓名
	int iNum;												//学号
	float fScore[3];										//学生 语文 数学 英语成绩
}Student;
/*创建车厢*/
typedef struct _Node
{
	Student stu;											//数据部分
	struct _Node* pNext;										//指向下一节点的指针
}Node;
/*链表的创建*/
Node* pHead = NULL;											//头结点初始化
void in()
{
	Node* pNewNode = (Node*)malloc(sizeof(Node));			//创建新节点
	pNewNode->pNext = NULL;
	/*采用头插法连接链表内容*/
		/*判断是否为头结点*/
		if (pHead == NULL)
		{
			pHead = pNewNode;								//若为头结点,则新节点指向头结点
		}
		else
		{
			pNewNode->pNext = pHead;						//新节点的下一节点指针指向头节点
			pHead = pNewNode;								//新节点成为头结点
		}
		printf("请输入学生姓名 学号 语文成绩 数学成绩 英语成绩.\n");
		scanf("%s %d %f %f %f", pNewNode->stu.cName, &pNewNode->stu.iNum, &pNewNode->stu.fScore[0], &pNewNode->stu.fScore[1], &pNewNode->stu.fScore[2]);
		printf("输入数据成功\n");
								
}
void Delete()
{
	int inum;
	printf("请输入要删除学生的学号:");
	scanf("%d",&inum);
	Node* p = pHead;										//定义指向头节点的指针
	Node* p1, * p2;
	/*当要删除信息为头结点时*/
	if (pHead->stu.iNum == inum)
	{
		p1 = pHead;
		pHead = pHead->pNext;								//头指针指向
		printf("删除成功.\n");
	}
	
	/*非头节点时*/
	while (p->pNext != NULL)								//指针到尾节点时中止
	{
		if (p->pNext ->stu.iNum== inum)
		{
			p2 = p->pNext;									//利用p2备份指针下一节点的指向
			p->pNext = p->pNext->pNext;						//然后令当下节点指向下下节点,将下一节点跳过
			free(p2);
			printf("删除成功.\n");

		}
		p = p->pNext;
	}
	if (p->pNext == NULL)
	{
		printf("未找到想要删除学生信息\n");
	}
}
/*显示输入信息*/
void Display()
{
	Node* p = pHead;										//遍历链表
	while (p != NULL)
	{
		printf("\t*姓名:%s*\t*学号:%d*\t*语文成绩:%.2f*\t*数学成绩:%.2f*\t*英语成绩:%.2f*\t\n", p->stu.cName, p->stu.iNum,p->stu.fScore[0],p->stu.fScore[1], p->stu.fScore[2]);
		p = p->pNext;
	}
}
main()
{

	while (1)
	{	
		printf("\t1.输入学生信息\n\t2.删除学生信息\n\t3.显示学生信息\n\t0.拜拜\n");
		char ch = _getch();										//获取一个字符
		switch (ch)
		{
			case '1':
				in();
				break;
			case '2':
				Delete();
				break;
			case '3':
				Display();
				break;
			case '0':
				printf("baibai\n");
				return 0;
				break;
			default:
				printf("\\error\n");
		}
		
	}
}

下边为效果展示

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值