在上一篇文章(c/c++单链表的具体代码实现-CSDN博客)中,我们讲了链表的初始化,
插入,删除,以及查找,和输出。因为上次时间紧迫,这次我再进行详细的说明。
再上一篇文章中我们说链表就像是一排连在一起箱子(单链表),只不过前一个箱子与后一个箱子相连。那么这些箱子该怎么初始化呢?
首先我们要先建造这些箱子是用来干什么的,下面是单链表初始化的模板:
struct mylist{
elemtype data;//其中elemtype需根据实际情况定义data
struct mylist *next;//开辟一块空间给下一个箱子
};
如果你决定mylist这个名字太长了,不妨使用typedef给他改个名字:
typedef struct mylist{
elemtype data;
struct mylist *next;
}ml;
初始化好了,那么该创建这些箱子出来了,我们可以写一个函数包装这个过程:
ml make(int n){ //n是箱子的个数
ml *ml=new ml;
ml *p=head,*r; //p用来复制head,避免找不回第一个箱子(头节点)
for(int i=1;i<=n;i++){
r=new ml; //添加新的箱子(节点)r
//做相应操作
r->next=NULL; //新的箱子的(节点)r的下一个箱子(节点)为空
p->next=r; //将新箱子(节点)与前一个节点p连接
p=r; //将p设为最后一个节点
}
return head; //返回第一个箱子(头节点)
}
接下来插入的一个箱子,是要在两个箱子之间插入;删除就更简单了,直接跳过某个箱子,到达另一个。代码的实现在上一篇文章有,这里就不多说了。
#include<iostream>
using namespace std;
typedef class school{
public:
void make(int n);
void push(int n);
void pop(int n);
void out();
void Find(int n);
typedef struct student{
int num;
string name;
struct student *next;
}node;
private:
node *head;
}data;
void data::make(int n){
head=new node;
node *p=head,*r;
for(int i=1;i<=n;i++){
r=new node;
r->num=i;
cout<<"请输入第"<<i<<"个学生的名字:";
cin>>r->name;
r->next=NULL;
p->next=r;
p=r;
}
}
void data::push(int n){
node *p=head,*r;
for(int i=1;i<=n;i++)
p=p->next;
r=new node;
r->num=n+1;
cout<<"请输入新的学生的名字:";
cin>>r->name;
r->next=p->next;
p->next=r;
while(r->next!=NULL){
r=r->next;
r->num++;
}
}
void data::pop(int n){
node *p=head;
for(int i=1;i<n;i++)
p=p->next;
p->next=p->next->next;
while(p->next!=NULL){
p=p->next;
p->num--;
}
}
void data::out(){
node *p=head->next;
while(p->next!=NULL){
cout<<"第"<<p->num<<"个学生的名字为:"<<p->name<<endl;
p=p->next;
}
cout<<"第"<<p->num<<"个学生的名字为:"<<p->name<<endl<<endl;
}
void data::Find(int n){
node *p=head;
for(int i=1;i<=n;i++){
p=p->next;
}
cout<<"学号为"<<p->num<<"的学生的名字是"<<p->name;
}
int main(){
//按实际操作
return 0;
}
在上一篇文章的末尾,我展示了这段代码。现在分析一下。
如果一位老师想制作一个名单,名单中要有每一个学生的学号和名字,那么我们根据关于链表的知识可以写出如下的代码:
#include<iostream>
using namespace std;
typedef struct student{
int num;
string name;
struct student *next;
}node;
mode make(int n){
node *head=new node;
node *p=head,*r;
for(int i=1;i<=n;i++){
r=new node;
r->num=i;
cout<<"请输入第"<<i<<"个学生的名字:";
cin>>r->name;
r->next=NULL;
p->next=r;
p=r;
}
return head;
}
void push(node &*head,int n){
node *p=head,*r;
for(int i=1;i<=n;i++)
p=p->next;
r=new node;
r->num=n+1;
cout<<"请输入新的学生的名字:";
cin>>r->name;
r->next=p->next;
p->next=r;
while(r->next!=NULL){
r=r->next;
r->num++;
}
}
void pop(node &*head,int n){
node *p=head;
for(int i=1;i<n;i++)
p=p->next;
p->next=p->next->next;
while(p->next!=NULL){
p=p->next;
p->num--;
}
}
void out(node *head){
node *p=head->next;
while(p->next!=NULL){
cout<<"第"<<p->num<<"个学生的名字为:"<<p->name<<endl;
p=p->next;
}
cout<<"第"<<p->num<<"个学生的名字为:"<<p->name<<endl<<endl;
}
void Find(node *head,int n){
node *p=head;
for(int i=1;i<=n;i++){
p=p->next;
}
cout<<"学号为"<<p->num<<"的学生的名字是"<<p->name;
}
int main(){
//具体操作 省略
return 0;
}
那接下来继续想,如果老师想将这个名单放进一个文件中,不想让其他同学直接看到,那么,我们可以用类将它再包装一下,也就是上一篇结尾的代码:
#include<iostream>
using namespace std;
typedef class school{
public:
void make(int n);
void push(int n);
void pop(int n);
void out();
void Find(int n);
typedef struct student{
int num;
string name;
struct student *next;
}node;
private:
node *head;
}data;
void data::make(int n){
head=new node;
node *p=head,*r;
for(int i=1;i<=n;i++){
r=new node;
r->num=i;
cout<<"请输入第"<<i<<"个学生的名字:";
cin>>r->name;
r->next=NULL;
p->next=r;
p=r;
}
}
void data::push(int n){
node *p=head,*r;
for(int i=1;i<=n;i++)
p=p->next;
r=new node;
r->num=n+1;
cout<<"请输入新的学生的名字:";
cin>>r->name;
r->next=p->next;
p->next=r;
while(r->next!=NULL){
r=r->next;
r->num++;
}
}
void data::pop(int n){
node *p=head;
for(int i=1;i<n;i++)
p=p->next;
p->next=p->next->next;
while(p->next!=NULL){
p=p->next;
p->num--;
}
}
void data::out(){
node *p=head->next;
while(p->next!=NULL){
cout<<"第"<<p->num<<"个学生的名字为:"<<p->name<<endl;
p=p->next;
}
cout<<"第"<<p->num<<"个学生的名字为:"<<p->name<<endl<<endl;
}
void data::Find(int n){
node *p=head;
for(int i=1;i<=n;i++){
p=p->next;
}
cout<<"学号为"<<p->num<<"的学生的名字是"<<p->name;
}
int main(){
return 0;
}
其中private中的只有在class内可以修改的成员,在外界是无法直接访问的。那么该怎么访问呢?这时候,就需要用到成员函数了,但成员函数一般只在class中声明而不定义,一般定义在class之外。成员函数就是访问private中的成员的途径了。
用class可以很好的将数据保护起来。
本期就到这啦,下一期估计会讲矩阵和矩阵的快速幂,本宝宝这么辛苦,记得三连喔,嘻嘻嘻!