c++关于链表(续上篇)

本文详细介绍了C/C++中的单链表初始化、插入、删除和查找操作,并探讨了如何使用类和成员函数保护数据,以及如何扩展到矩阵和快速幂主题。
摘要由CSDN通过智能技术生成

        在上一篇文章(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可以很好的将数据保护起来。

        本期就到这啦,下一期估计会讲矩阵和矩阵的快速幂,本宝宝这么辛苦,记得三连喔,嘻嘻嘻!

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值