学生管理系统-动态链表

以学生管理系统来巩固动态链表的学习

1配置头文件与源文件

在这里插入图片描述
link.cpp中写我们进行链表操作的主要代码
help()方法包含了用户的界面帮助
在这里插入图片描述

#include"link.h"
//帮助文档
void help()
{
	cout << "********************************" << endl;
	cout << "help:帮助信息                  *" << endl;
	cout << "insert:插入链表结点            *" << endl;
	cout << "print:遍历链表                 *" << endl;
	cout << "search:查询链表某个节点        *" << endl;
	cout << "delete:删除列表某个节点        *" << endl;
	cout << "free:释放整个链表              *" << endl;
	cout << "quit:退出程序                  *" << endl;
	cout << "cls:清屏                       *" << endl;
	cout << "********************************" << endl;
}

main.cpp中写主函数:所要进行的操作调用什么方法
第一步我们先进行一下简单的测试

#include<iostream>
#include"link.h" //主函数要使用link.cpp 要包含link.h头文件
using namespace std;

int main(int argc, char* argv[])
{
	help();

	//输入用户指令
	while (1)
	{
		char cmd[64] = "";
		cout << "输入操作指令";
		cin >> cmd;

		if (strcmp(cmd,"help") ==0)
		{
			help();
		}
		else if (strcmp(cmd, "insert") == 0)
		{
			cout << "----------insert---------" << endl;
		}
		else if (strcmp(cmd, "print") == 0)
		{
			cout << "----------print----------" << endl;
		}
		else if (strcmp(cmd, "search") == 0)
		{
			cout << "----------search---------" << endl;
		}
		else if (strcmp(cmd, "delete") == 0)
		{
			cout << "----------delete---------" << endl;
		}
		else if (strcmp(cmd, "free") == 0)
		{
			cout << "----------free---------" << endl;
		}
		else if (strcmp(cmd, "cls") == 0)
		{
			system("cls");
		}
		else if (strcmp(cmd, "quit") == 0)
		{
			exit(-1);//return 0;
		}

	}
	return 0;
}

link.h中写link.cpp所需的头文件

#pragma once //声明
#ifndef LINK_H
#define LINK_H
#include<iostream>
using namespace std;
extern void help(void);//添加link.cpp外部声明关键词为extern
#endif // DEBUG

2插入

2.1定义链表节点类型

link.h头文件中定义链表类型结构体

//定义链表节点类型
struct STU
{
	//数据域
	int num;
	char name[32];
	//指针域
	struct STU *next;
};

同时在main.h中定义表头结点

struct STU* head = NULL; //定义链表头来定位在哪个链表上进行操作

2.2修改主函数插入入口

else if (strcmp(cmd, "insert") == 0)
		{
			cout << "请输入要插入的节点信息(num,name):" ;
			STU tmp;
			cin >> tmp.num >> tmp.name;

			head = insertLink(head,tmp);//将tmp插入到以head为表头节点的链表之中,之后并更新表头节点
		}

2.3添加操作

//有序插入
STU* insertLink(STU* head, STU tmp)
{
	//从堆中申请待插入的节点空间
	STU* pi = new STU;
	//给pi赋值
	*pi = tmp;
	pi->next = NULL;

	//判断链表是否为空
	if (head == NULL)
	{
		head = pi;
	}
	else
	{
		//寻找插入点
		STU* ph = head, * pb = head;
		while ((pb->num < pi->num) && (pb->next != NULL))
		{
			//ph保存pb的位置
			ph = pb;
			//pb移动到下一节点
			pb = pb->next;
		}

		//判断插入点的位置
		if (pb->num >= pi->num) //头部、中部插入
		{
			if (pb == head) //头部插入
			{
				pi->next = head;
				head = pi;
			}
			else//中部
			{
				ph->next = pi;
				pi->next = pb;
			}
		}
		else //尾部插入
		{
			pb->next = pi;
		}
	}
	return head;
}
#endif

2.4在link.h头文件中添加

extern STU* insertLink(STU* head, STU tmp);

3遍历

3.1修改主函数插入入口

else if (strcmp(cmd, "print") == 0)
		{
			printLink(head);
		}

3.3添加操作

//遍历链表
void printLink(STU* head)
{
	//判断链表是否存在
	if (head == NULL)
	{
		cout << "link not exist" << endl;
		return;
	}

	STU* pb = head;
	while (pb!=NULL)
	{
		cout << pb->num << " " << pb->name << endl;
		pb = pb->next;
	}
	return ;
}

3.4在link.h头文件中添加

extern void printLink(STU* head);

4查找

4.1修改主函数插入入口

else if (strcmp(cmd, "search") == 0)
		{
			cout << "输入查询的姓名" ;
			char name[32]=" ";
			cin >> name;

			STU* ret = NULL;
			ret = searchNote(head,name);//返回查找到节点
			if (ret!=NULL)
			{
				cout << "num=" << ret->num << ",name=" << ret->name << endl;
			}
		}

4.2添加操作

//查找
STU* searchNote(STU* head, char* name)
{
	//判断表是否存在
	if (head==NULL)
	{
		cout << "为空表";
		return NULL;
	}
	//逐个节点查询
	STU* pb = head;
	while ((strcmp(pb->name,name)!=0)&&(pb->next!=NULL))
	{
		pb = pb->next;
	}

	if(strcmp(pb->name, name) == 0)
	{
		return pb;
	}
	return NULL;
}

4.3在link.h头文件中添加

extern STU* searchNote(STU* head, char* name);

5删除

5.1修改主函数插入入口

else if (strcmp(cmd, "delete") == 0)
		{
			cout << "输入删除的学号";
			int num = 0;
			cin >> num;

			head = deleteNote(head, num);//删除的话有可能删除的是头节点,所以在这里要提前考虑更新头结点
		}

5.2添加操作

//删除
STU* deleteNote(STU* head, int num)
{
	//判断表是否存在
	if (head == NULL)
	{
		cout << "为空表";
		return NULL;
	}

	//先查询到再删除
	//逐个元素比较
	STU* pf = head, *pb = head;
	//寻找插入点同时不要越界
	while ((pb->num != num) && (pb->next != NULL))
	{
		pf = pb;
		pb = pb->next;
	}
	if (pb->num==num)
	{
		if (pb==head)//头删
		{
			head = head->next;
		}
		else
		{
			pf->next = pb->next;
		}
		delete pb;
	}
	return head;
}

5.3在link.h头文件中添加

extern STU* deleteNote(STU* head, int num);

6释放

6.1修改主函数插入入口

else if (strcmp(cmd, "free") == 0)
		{
			freeLink(head);
		}

6.2添加操作

STU* freeLink(STU* head)
{
	//判断表是否存在
	if (head == NULL)
	{
		cout << "为空表";
		return NULL;
	}
	
	//逐个节点释放
	STU* pb = head;
	while (pb!=NULL)
	{
		head = head->next;
		delete pb;
		pb = head;
	}
	return head;
}

6.3在link.h头文件中添加

extern STU* freeLink(STU* head);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言-学生信息管理系统是一个基于链表数据结构的学生信息管理系统。链表是一种数据结构,可以存储和管理一系列具有相同类型的数据。在学生信息管理系统中,链表被用来存储和操作学生的基本信息。 该系统主要有以下功能: 1. 添加学生信息:可以添加学生的姓名、学号、性别、年龄等信息,并将该学生的信息节点插入到链表中。 2. 删除学生信息:根据学号或其他关键词查找到对应的学生信息节点,并从链表中删除该节点。 3. 修改学生信息:根据学号或其他关键词查找到对应的学生信息节点,并根据需求修改学生的信息。 4. 查询学生信息:可以根据学号或其他关键词查找到对应的学生信息节点,并显示该学生的详细信息。 5. 遍历学生信息:可以遍历整个链表,显示所有学生的基本信息。 链表的优势在于插入和删除节点的操作比较高效,因为只需要改变节点的指针指向即可,不需要移动其他节点。而数组在插入和删除操作时需要移动其他元素,效率较低。 在实现学生信息管理系统时,可以使用指针来操作链表,通过指针的指向找到链表的某个节点,并进行相应的操作。同时,需要注意对内存的管理,确保动态分配和释放内存的正确性,避免内存泄漏和访问错误。 总之,C语言-学生信息管理系统是一个基于链表数据结构的系统,可以实现学生信息的增删改查等功能。通过灵活运用链表的特点,可以高效地管理学生的基本信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值