C++链表的应用:学生信息系统的建立与维护(插入排序)

1. 学生信息表

利用链表存储和维护学生信息,包括学号(10 位数字)、姓名(不超过 50 个字符)、性别

和成绩

设计并完成以下链表操作子函数

统计并返回链表的节点数目(不包括头节点)

查找并输出第 k 个节点的信息;如果节点数小于 k,则提示“节点不存在”

在第 k 个节点后,插入一个新节点;如果节点数小于 k,则插在链表最后

删除第 k 个节点;如果节点数小于 k,则删除最后一个节点;如果链表为空,则提示

“空链表无法删除”

#include<iostream>
using namespace std;
struct node
{
	long long int ID;
	char name[50];
	char geder;
	float score;
	node *next;
};//定义含有指针的结构体 
void link_sum(node *p)
{
	int a=0;
	while(p->next!=NULL)
	{
		a++;
		p=p->next;
	}
	cout<<a<<endl;
}//统计节点数 
int link_insert_tail(node *p,int k)
{
	while(k>0&&p->next!=NULL)
	{
		k--;
		p=p->next;
	}
	node *ptr=new node;
	cout<<"学生身份"; 
	cin>>ptr->ID;
	cout<<"学生名字(仅支持英文或拼音)";
	cin>>ptr->name;
	cout<<"学生性别"; 
	cin>>ptr->geder;
	cout<<"学生成绩"; 
	cin>>ptr->score;
	ptr->next=p->next;
	p->next=ptr;
	return 1;
}//输入或插入结构体 
void link_cout(node *p)
{
	while(p->next!=NULL)
	{
cout<<(p->next)->ID<<""<<(p->next)->name<<""<<(p->next)->geder<<""<<(p->next)->score<<endl;
		p=p->next;
	}
}//输出结构体内容 
void link_find_tail(node *p,int k)
{
	while (k)
	{
		p=p->next;
		k--;
	    if (p->next==NULL)
	    {
		    cout<<"节点不存在";
		    break;
	    }
	}   
	    cout<<(p->next)->ID<<""<<(p->next)->name<<""<<(p->next)->geder<<""<<(p->next)->score<<endl;
}//寻找第K个值 
int link_delete_tail(node *p,int k)
{
	if(p->next==NULL)
	{
		cout<<"链表无法删除";
		return 0;
	}
	while(k-1>0)
	{
	    p=p->next;
k--;
    	if(p->next->next==NULL)
		{
			break;
		}
	}
	node *prt;
	prt=(p->next)->next;
	delete p->next;
	p->next=prt;
	return 1;
}//回收内存 
int main()
{
	node head;
	head.next=NULL;
	cout<<"请输入n值:";
	int n,i=0,k,m;
	cin>>n;
	cout<<"请输入学生相关信息:"<<endl; 
	while(i<n)
    {
    	link_insert_tail(&head,100);
    	i++;
	}
	cout<<"节点总数为:"; 
	link_sum(&head);
	cout<<"请输入要插入的位置k:";
	cin>>k;
	cout<<"输入要插的值:"<<endl;
	link_insert_tail(&head,k);
	cout<<"各学生信息为:"<<endl; 
    link_cout(&head);
    cout<<"输入要删除的学生:";
    int h;
    cin>>h;
    link_delete_tail(&head,h);
	link_cout(&head);
	cout<<"请输入要查看的位置:" ;
	cin>>m;
	m=m-1;
	link_find_tail(&head,m);
	return 0;
}

链表插入排序

学生信息包括学号(10 位数字)、姓名(不超过 50 个字符)、性别和成绩;输入多个学生

的信息,存储到链表中

基于“ 插入排序” ”算法,将所有学生信息按照成绩由高到低输出

#include<iostream>
using namespace std;
struct node
{
	long long int ID;
	char name[50];
	char geder;
	float score;
	node *next;
};
void link_cout(node *p)
{
	while(p->next!=NULL)
	{
cout<<(p->next)->ID<<""<<(p->next)->name<<""<<(p->next)->geder<<""<<(p->next)->score<<endl;
		p=p->next;
}
}//输出函数 
int main()
{
	node *head=new node;
	head->next=NULL;
	node*ptr=head;//建立空链 
	cout<<"请输入学生个数:";
	int n;
	cin>>n;
	cout<<"请输入学生相关信息:"; 
	for(int i=0;i<n;i++)
    {
    	node *p=head;
		while(p->next!=NULL)
		{
			p=p->next;
		}
		node *ptr=new node;
		cin>>ptr->ID;
		cin>>ptr->name;
		cin>>ptr->geder;
		cin>>ptr->score;
		ptr->next=NULL;
		p->next=ptr;
	}//输入学生信息
	cout<<"各学生初始信息为:"<<endl;
	cout<<"学号"<<" "<<"姓名"<<" "<<"性别"<<" "<<"成绩"<<endl;
    link_cout(head);//输出 
    cout<<"排序后的结果为"<<endl;
    cout<<"学号"<<" "<<"姓名"<<" "<<"性别"<<" "<<"成绩"<<endl;
    node* p = head->next->next, * q = p, * r = head;
	head->next->next = NULL;
	r = head;//断裂链表并把断裂后的表赋予q 
	while (p != NULL) 
	{
		q = q->next;
		p->next = NULL;
		while (r->next != NULL) 
		{
			if (r->next->score<= p->score) 
			{
				p->next = r->next;
				r->next = p;
				break;
			}//进行成绩比较 
			else 
			{
				r = r->next;
			}
		}
		if (r->next == NULL) 
		{
			r->next = p;
		}
		r = head;
		p = q;
	}
	r = r->next;
	link_cout(head);
     return 0;
}//排序并输出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值