c++链表学生管理系统,比较稳定

#include <cstdlib>
#include <cstring>
#include<iostream>
#include<cctype>
using namespace std;
#include<string>
typedef struct Node
{
	char name[10];
	int num;
	int age;
	struct Node* next;
}lnode;

//创建一个学生链表
struct Node* createlist()
{
	lnode *list = new lnode;
	list->next = NULL;
	return list;
}
//创建一个学生的结点
struct Node* createnode(char *newname, int newnum, int newage)
{
	lnode *node1 = new lnode;
	strcpy_s(node1->name, newname);
	node1->age = newage;
	node1->num = newnum;
	node1->next = NULL;
	return node1;
}

//在尾部插入一个学生的信息
void insertback(lnode *list, char *newname, int newnum, int newage)
{
	lnode *newnode = createnode(newname, newnum, newage);
	//找到尾结点
	lnode *temp = list;//移动的结点用来找到尾结点
	while (temp->next != NULL) //一直移动到最后一个结点
	{
		temp = temp->next;
	}
	newnode->next = NULL;
	temp->next = newnode;
}


//查找学生的信息
void searchinfo(lnode *list, char *name)
{
	lnode *temp = list->next;
	if (temp == NULL)
	{
		cout << "没有学生信息\n";
		return;
	}
	while (strcmp(temp->name, name) != 0)
	{
		if (temp->next == NULL)
		{
			cout << "没有此学生的信息\n";
			return;
		}
		temp = temp->next;
	}
	cout << "姓名" << temp->name << endl;
	cout << "编号:" << temp->num << endl;
	cout << "年龄 :" << temp->age << endl;
}


//删除学生信息
void deleteinfo(lnode *list, char *num)
{
	lnode *temp = list;  //用来找到要删除的前面一个结点
	lnode *p = list->next;//指向需要删除的结点
	if (p == NULL)
	{
		cout<<"没有学生信息\n";
		return;
	}
	int sumint=0;
	for (int i = 0; i <strlen(num); i++)
	{
		char temp_char = num[i];	    
		int temp_int = temp_char - '0';	 
		sumint=sumint*10+temp_int;
	}

	while (p->num!=sumint)
	{
		if (p->next == NULL)
		{
			cout << "没有此学生的信息\n";
			return;
		}
		temp = temp->next;
		p = p->next;
	}
	temp->next = p->next;
	cout << "删除成功" << endl;
	free(p);
}

void print(lnode *list)//打印所有的信息
{
	lnode *temp = list->next;
	if (temp == NULL)
	{
		cout << "没有学生信息\n";
		return;
	}
	while (temp)
	{
		cout << "姓名" << temp->name << endl;
		cout << "编号:" << temp->num << endl;
		cout << "年龄 :" << temp->age << endl;
		temp = temp->next;
	}

}

void menu()//菜单界面
{
	cout<<"****************************************\n";
	cout<<"*        1、插入学生信息               *\n";
	cout<<"*        2、查找学生信息               *\n";
	cout<<"*        3、打印所有信息               *\n";
	cout<<"*        4、删除学生信息               *\n";
	cout<<"*        5、退出管理系统               *\n";
	cout<<"****************************************\n";
}

int choice()//选择需要的操作
{
loop:
	char *a = new char[100];
	cout << "请选择您要执行的操作:\n";
	cin >>a;
	for (int i = 0; i<100; i++)
	{
		int b = a[i] - '0';
		if (b < 1 || b > 5)
		{
			cout << "您的输入有误,请重新输入:\n";
			goto loop;
		}
		else 
		{
			if (a[1] == NULL)
			{
				return a[0] - '0';
			}
			
		}
			
	}
	
}

void work(lnode *student)
{
	menu();
	int a = choice();
	switch (a)
	{
	case 1:
	{
		char name[10] = "0";
		int num = 0,age=0;
		cout<<"输入信息姓名,编号,年龄:\n";
		cin >> name >> num >> age;
		insertback(student, name, num, age);
	}break;
	case 2:
	{
		char searchname[10] = "0";
		cout << "请输入你要查找的学生的名字:\n";
		cin >> searchname;
		searchinfo(student, searchname);
	}break;
	case 3:print(student);
		break;
	case 4:
	{
		char *deletenum=new char[10];
		cout<<"请输入你要删除的学生的编号:\n";
		cin >> deletenum;
		deleteinfo(student, deletenum);
	}break;
	case 5:
		cout << "再见" << endl;
		exit(0);
		break;
	default: cout << "输入错误\n";
		break;
	}
}

int main()
{
	lnode *student = createlist();
	while (1)
	{
		work(student);
	}
	system("pause");
	return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值