c++链表(学生信息)

目录

 1.根据学生信息储存结构,定义结点类型如下:

2.根据单链表定义和学生成绩信息的节点类型,单链表类型可定义如下:

3.单链表的建立

4.单链表的输出

5.单链表结点的插入

6.链表结点的删除

 7.单链表的销毁


 单链表的定义:

单链表是由若干数据元素(结点)按一定原则连接。原则是前一个结点“指向”下一个结点,只能通过前一个结点才能找到下一个结点。链表通常有一个“头指针变量”,他存放了一个地址,该地址是链表的第一个元素的地址。链表是一种常见的数据结构下面利用学生信息来简单介绍链表。

 1.根据学生信息储存结构,定义结点类型如下:

typedef struct StuNode
{
	int snum;
	char sname[20];
	float score;
	struct Student *next; 
}Student, *StuPtr;

2.根据单链表定义和学生成绩信息的节点类型,单链表类型可定义如下:

class Student{
	private :
	StuPtr head;  //定义头结点指针 
	StuPtr tail;  //为方便,定义指向尾结点的指针 
	int count;
	public:
		StuListLink(){};   //构造函数 
		void CreateStuList();
		void CreateStuList(int h); 
		void PrintStuList();
		void InsertStuList();
		void DeleteStu();
		void DestroyStuList(); 
};

(只声明了一个struct Student 类型,并没有分配储存空间)

以下皆为带头结点的链表的代码

优点:(1)在任何结点之前插入结点或删除表中的任何结点,都是修改前一结点的指针域。

          (2)头指针是指向头结点的非空指针,所以空表和飞空表处理方式一样。

3.单链表的建立

void StuListLink::CreateStuList(int h) {
	StuPtr p;      //定义p结点
	cout<<"输入学生总数:"<<endl;
	cin>>conut;
	if(count<0) {
		cout<<"输入有误."<<endl;
		return;
	}

	head=new Student;     //为头结点开辟内存空间
    /*头结点为空*/
	head->snum=0;         
	head->sname[0]='\0';
	head->score=0;
	head->next=NULL;      //head指向空定义域
	tail=head;            //表为空时,表头即为表位
	for(i=0;i<count;i++)
	{
		p=new Student;
		cout<<"请输入学生学号 姓名 成绩:"<<endl;
		cin>>p->snum>>p->sname>>p->score;
		p->next=NULL;     //p指向空定义域
		tail->next=p;     //将p接到表尾
		tail=p;           //结点p为新的表尾
	}
	cout<<"链表创建成功,一共"<<count<<"个学生."<<endl; 
}

4.单链表的输出

void StuListLink::PrintStuList()
{
	StuPtr p;
	p=head->next;  //head为空指针
	if(p==NULL)
	{
		cout<<"链表为空!"<<endl;
		return;
	}
	while (p!=NULL)
	{
		cout<<"学生信息:学号"<<p->snum<<",姓名"<<p->sname<<",成绩"<<p->score<<";"<<endl;
		p=p->next;
	}
}

5.单链表结点的插入

尾插法图解:

 

中间插入图解: 

 

 

void StuListLink::InsertStu()
{
	StuPtr p,pre;
	StuPtr pNode;     //创建新结点,存放新插入学生信息
	int sno;
	cout<<"请输入要在哪个学号之后插入学生信息:"<<endl;
	cin>>sno;
	pNode=new Student;    //为新结点开辟内存空间
	cout<<"请输入学生的学号 姓名 成绩:"<<endl;
	cin>>pNode->snum>>pNode->sname>>p->score;
	p=head->next;     //因为头指针定义为空结点,所以p为头指针的下一个结点  
	pre=head;         //将pre定义为头结点
	while(p!=NULL)      
	{
		pre=p;
		if(p->snum==sno)     //遍历链表直到末尾找到指定学号,跳出循环
		{
			break;
		}
		p=p->next;
	 } 
/*若未找到指定学号,则pre指向尾结点;反之指向指定学号结点*/
/*所以p始终插入到pre结点之后.*/
    pNode->next=pre->next;
    pre->next=pNode;     
}

6.链表结点的删除

void StuListLink::DeleteStu()
{
	StuPtr p,pre;
	cout<<"请输入要删除的学号:"<<endl;
	cin>>sno;
	pre=head,p=head->next;    //p为当前遍历到的结点,pre为其前趋结点
	while(p!=NULL)
	{
		if(p->snum==sno)  //找到指定节点
		{
			pre->next=p->next;   //将前趋结点的指针域指向待删结点的后趋结点
			delete p;            //释放结点
			p=NULL;              //将释放的结点定义为空
			cout<<"删除成功!";
			return;
		}
		pre=p;
		p=p->next;
	}
	cout<<"未找到该结点,删除失败!"<<endl; 
 } 

链表删除结点的图解 :

查看源图像

 7.单链表的销毁

void StuListLink::DestroyStuList()
{
	StuPtr p,ptr;
	p=head;
	while(p!=NULL)
	{
		ptr=p;
		p=p->next;
		delete p;
	}
	head=NULL;    //确保头指针为空,不指向其他结点 
	cout<<"学生链表已销毁."<<endl;
 } 

实现程序具体操作可见第一篇博客:C++(类与对象)虚函数实现多态求长方体和圆柱体的体积_Ly0.的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值