赞
踩
目录
2.根据单链表定义和学生成绩信息的节点类型,单链表类型可定义如下:
单链表的定义:
单链表是由若干数据元素(结点)按一定原则连接。原则是前一个结点“指向”下一个结点,只能通过前一个结点才能找到下一个结点。链表通常有一个“头指针变量”,他存放了一个地址,该地址是链表的第一个元素的地址。链表是一种常见的数据结构。下面利用学生信息来简单介绍链表。
- typedef struct StuNode
- {
- int snum;
- char sname[20];
- float score;
- struct Student *next;
- }Student, *StuPtr;
- 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)头指针是指向头结点的非空指针,所以空表和飞空表处理方式一样。
- 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;
- }

- 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;
- }
- }
尾插法图解:
中间插入图解:
- 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;
- }

- 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;
- }

链表删除结点的图解 :
- 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博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。