目录
2.根据单链表定义和学生成绩信息的节点类型,单链表类型可定义如下:
单链表的定义:
单链表是由若干数据元素(结点)按一定原则连接。原则是前一个结点“指向”下一个结点,只能通过前一个结点才能找到下一个结点。链表通常有一个“头指针变量”,他存放了一个地址,该地址是链表的第一个元素的地址。链表是一种常见的数据结构。下面利用学生信息来简单介绍链表。
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博客