C/C++链表知识

C语言/C++中链表的知识一直困扰着我,但是亲自写了一下函数,遍历,查找,插入,删除,很有用耶。

一个程序学会一个知识点。

#include<iostream>
#include<string>
using namespace std;

struct Student
{
	string name;
	int score;
	struct Student* next;
};
typedef Student S;

class Message
{
public:
	Message();//构造函数,创建链表
	void Input();//输入学生姓名和成绩
	void Output();//输出学生姓名和成绩
	void DeleteAll();//删除所有信息,析构函数
	void Deletesome();//删除指定位置信息
	void Deletehead();//删除头部信息
	void Deleteend();//删除尾部信息
	int Addsome();//增加指定位置信息
	void Addhead();//增加头部位置信息
	void Addend();//增加尾部位置信息
	void number();//统计总人数
	int searchsome();//搜索某一个学生的信息
private:
	S* head;
};

Message::Message()
{
	head = new S;//申请内存
	head->name = '\0';//数据域为空
	head->score = 0;
	head->next = NULL;//头结点的下一个定义为空
}
void Message::DeleteAll()
{
	delete head;	//删除头结点
}

int count = 0;//定义一个计数器,记录总人数
void Message::Input()
{
	int n;//记录长度
	S *newp, *stemp;//定义连个结构体指针变量,一个新的节点,一个用于计算交换的节点
	stemp = head;
	cout<<"请输入记录的总人数"<<endl;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		newp = new S;//动态申请内存
		cout<<"请输入第"<<++i<<"个学生信息"<<endl;
		cout<<"学生姓名: "<<newp->score<<endl;
		cout<<"学生java成绩: "<<newp->score<<endl;
		newp->next = NULL;//到这里一个新的节点就制作完成了,接下来需要把节点插入进去
		stemp->next = newp;//相当于头结点的下一个为新节点
		stemp = newp;//将当前节点变为新节点,这样就完成了录入
	}

}

void Message::Output()
{
	if(head==NULL||head->next==NULL)
	{
		cout<<"没有学生信息,此链表为空"<<endl;
	}
	S *p = head;
	while(p->next!=NULL)
	{
		p = p->next;
		cout<<"学生成绩 "<<p->name<<endl;
		cout<<"学生成绩 "<<p->score<<endl<<endl;
	}
}

int Message::searchsome()
{
	string name;
	cout<<"请输入要查找的学生姓名 "<<endl;
	cin>>name;
	S *p = head;
	if(head==NULL||head->next==NULL)
	{
		cout<<"没有学生信息,此链表为空"<<endl;
		return NULL;
	}
	else{
		while(p->next!=NULL)
		{
			if(p->name == name)
			{
				cout<<"学生姓名 "<<p->name<<endl;
				cout<<"学生分数 "<<p->score<<endl<<endl;
			}
			p = p->next;//指向下一个
		}
		return NULL;//遍历完也未查到
	}

}

void Message::number()
{
	int count = 0;
	S *p = head->next;//统计人数,头结点是没有数据的,所以头结点的下一个才有信息。
	while(p!=NULL)
	{
		count++;
		p = p->next;
	}
	cout<<"总人数是 "<<count<<endl;
}

void Message::Addhead()
{
	S *newp = new S;
	cout<<"请输入学生姓名 "<<endl;
	cin>>newp->name;
	cout<<"请输入该学生java成绩 "<<endl;
	cin>>newp->score;
	S *p = head;//插入数据一般需要新节点,头结点和一个用于转换的节点
	if(head==NULL)//如果头结点为空
	{
		newp = head;
	}
	newp->next = p->next;
	p->next = newp;
}
void Message::Deletehead()
{
	S *p = head;
	if(p==NULL||p->next==NULL)
	{
		cout<<"链表为空"<<endl;
	}
	else{
		S *stemp = NULL;//设置一个站位点
		p = p->next;
		stemp = p->next;//将头结点的下下个节点指向站位点
		delete p;//删除头结点的下一个节点
		p = NULL;
		head->next  = stemp;//头结点的指针更换
	}
}

int Message::Addsome()
{
	S *newp = new S;
	S *p = head;
	string name;
	cout<<"将信息插入在(?姓名?)的后面 "<<endl;
	cin>>name;
		while(p->next!=NULL)
		{
			if(p->name == name)
			{
				 p = p->next;//将新节点插入到此节点的后面位置
				newp->next  = p->next;
				p->next = newp;
			}
			p = p->next;//指向下一个
		}
		return NULL;//遍历完也未查到指定的节点
}





@有什么不对的,call我哦。谢谢

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

threecat.up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值