当前位置:   article > 正文

c++链表(学生信息)_输入班级10个学生信息,其数据信息包含学号,用单链表进行存储,然后编程实现下列算

输入班级10个学生信息,其数据信息包含学号,用单链表进行存储,然后编程实现下列算

目录

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

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

3.单链表的建立

4.单链表的输出

5.单链表结点的插入

6.链表结点的删除

 7.单链表的销毁


 单链表的定义:

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

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

  1. typedef struct StuNode
  2. {
  3. int snum;
  4. char sname[20];
  5. float score;
  6. struct Student *next;
  7. }Student, *StuPtr;

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

  1. class Student{
  2. private :
  3. StuPtr head; //定义头结点指针
  4. StuPtr tail; //为方便,定义指向尾结点的指针
  5. int count;
  6. public:
  7. StuListLink(){}; //构造函数
  8. void CreateStuList();
  9. void CreateStuList(int h);
  10. void PrintStuList();
  11. void InsertStuList();
  12. void DeleteStu();
  13. void DestroyStuList();
  14. };

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

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

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

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

3.单链表的建立

  1. void StuListLink::CreateStuList(int h) {
  2. StuPtr p; //定义p结点
  3. cout<<"输入学生总数:"<<endl;
  4. cin>>conut;
  5. if(count<0) {
  6. cout<<"输入有误."<<endl;
  7. return;
  8. }
  9. head=new Student; //为头结点开辟内存空间
  10. /*头结点为空*/
  11. head->snum=0;
  12. head->sname[0]='\0';
  13. head->score=0;
  14. head->next=NULL; //head指向空定义域
  15. tail=head; //表为空时,表头即为表位
  16. for(i=0;i<count;i++)
  17. {
  18. p=new Student;
  19. cout<<"请输入学生学号 姓名 成绩:"<<endl;
  20. cin>>p->snum>>p->sname>>p->score;
  21. p->next=NULL; //p指向空定义域
  22. tail->next=p; //将p接到表尾
  23. tail=p; //结点p为新的表尾
  24. }
  25. cout<<"链表创建成功,一共"<<count<<"个学生."<<endl;
  26. }

4.单链表的输出

  1. void StuListLink::PrintStuList()
  2. {
  3. StuPtr p;
  4. p=head->next; //head为空指针
  5. if(p==NULL)
  6. {
  7. cout<<"链表为空!"<<endl;
  8. return;
  9. }
  10. while (p!=NULL)
  11. {
  12. cout<<"学生信息:学号"<<p->snum<<",姓名"<<p->sname<<",成绩"<<p->score<<";"<<endl;
  13. p=p->next;
  14. }
  15. }

5.单链表结点的插入

尾插法图解:

 

中间插入图解: 

 

 

  1. void StuListLink::InsertStu()
  2. {
  3. StuPtr p,pre;
  4. StuPtr pNode; //创建新结点,存放新插入学生信息
  5. int sno;
  6. cout<<"请输入要在哪个学号之后插入学生信息:"<<endl;
  7. cin>>sno;
  8. pNode=new Student; //为新结点开辟内存空间
  9. cout<<"请输入学生的学号 姓名 成绩:"<<endl;
  10. cin>>pNode->snum>>pNode->sname>>p->score;
  11. p=head->next; //因为头指针定义为空结点,所以p为头指针的下一个结点
  12. pre=head; //将pre定义为头结点
  13. while(p!=NULL)
  14. {
  15. pre=p;
  16. if(p->snum==sno) //遍历链表直到末尾找到指定学号,跳出循环
  17. {
  18. break;
  19. }
  20. p=p->next;
  21. }
  22. /*若未找到指定学号,则pre指向尾结点;反之指向指定学号结点*/
  23. /*所以p始终插入到pre结点之后.*/
  24. pNode->next=pre->next;
  25. pre->next=pNode;
  26. }

6.链表结点的删除

  1. void StuListLink::DeleteStu()
  2. {
  3. StuPtr p,pre;
  4. cout<<"请输入要删除的学号:"<<endl;
  5. cin>>sno;
  6. pre=head,p=head->next; //p为当前遍历到的结点,pre为其前趋结点
  7. while(p!=NULL)
  8. {
  9. if(p->snum==sno) //找到指定节点
  10. {
  11. pre->next=p->next; //将前趋结点的指针域指向待删结点的后趋结点
  12. delete p; //释放结点
  13. p=NULL; //将释放的结点定义为空
  14. cout<<"删除成功!";
  15. return;
  16. }
  17. pre=p;
  18. p=p->next;
  19. }
  20. cout<<"未找到该结点,删除失败!"<<endl;
  21. }

链表删除结点的图解 :

查看源图像

 7.单链表的销毁

  1. void StuListLink::DestroyStuList()
  2. {
  3. StuPtr p,ptr;
  4. p=head;
  5. while(p!=NULL)
  6. {
  7. ptr=p;
  8. p=p->next;
  9. delete p;
  10. }
  11. head=NULL; //确保头指针为空,不指向其他结点
  12. cout<<"学生链表已销毁."<<endl;
  13. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/233131?site
推荐阅读
相关标签
  

闽ICP备14008679号