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我哦。谢谢