此程序所写链表,删除功能只能在表尾每次删除一个学生,可在任意合理范围内根据key值插入学生,并打印消息。在查找某个学生位置时,可以考虑写一个search函数,本文在各个函数内直接查找,代码略显冗余。后期有空改进。
list.h
#ifndef LIST_H_
#define LIST_H_
#include "string"
#include "iostream"
using namespace std;
typedef struct info
{
string name;
string number;
}information;
typedef struct stu
{
struct stu* prev;
int key;
information name_num;
struct stu* next;
}student;
class list
{
public:
list();
~list();
void insert(string name,string number,int k);
void deletee();
void show() const;
private:
student* head;
int key;
};
#endif
list.cpp
list::list()
{
head=nullptr;
key=0;
}
void list::insert(string name,string number,int k)
{
++key;
if(k<1 || k>key)
{
cout<<"无此位置,请重新输入!";
return;
}
else if(k==1)
{
if(head==nullptr)
{
head=new student;
(*head).key=key;
(*head).name_num.name=name;
(*head).name_num.number=number;
(*head).prev=nullptr;
(*head).next=nullptr;
}
else
{
(*head).prev=new student;
(*(*head).prev).next=head;
(*(*head).prev).prev=nullptr;
(*(*head).prev).key=k;
(*(*head).prev).name_num.name=name;
(*(*head).prev).name_num.number=number;
head=(*head).prev;
student* empty=head;
for(int i=0;i<key;++i)
{
(*empty).key=i+1;
empty=(*empty).next;
}
}
}
else if(k>1 && k==key)
{
student* empty = head;
while((*empty).next!=nullptr)
{
empty=(*empty).next;
}
(*empty).next=new student;
(*(*empty).next).name_num.name=name;
(*(*empty).next).name_num.number=number;
(*(*empty).next).key=key;
(*(*empty).next).next=nullptr;
(*(*empty).next).prev=empty;
}
else
{
student* empty = head;
while((*empty).key!=k-1)
{
empty=(*empty).next;
}
student* dempty =(*empty).next;
(*empty).next=new student;
(*(*empty).next).name_num.name=name;
(*(*empty).next).name_num.number=number;
(*(*empty).next).key=key;
(*(*empty).next).prev=empty;
(*(*empty).next).next=dempty;
(*dempty).prev=(*empty).next;
empty=head;
for(int i=0;i<key;++i)
{
(*empty).key=i+1;
empty=(*empty).next;
}
}
}
void list::deletee()
{
if(key==0)
{
cout<<"No student can be delete!"<<endl;
}
else if(key==1)
{
delete head;
head=nullptr;
--key;
}
else
{
student* empty = head;
while((*empty).next!=nullptr)
{
empty=(*empty).next;
}
empty=(*empty).prev;
delete (*empty).next;
(*empty).next=nullptrL;
--key;
}
}
void list::show( ) const
{
if(key==0)
cout<<"No student!"<<endl;
else
{
student* empty = head;
cout<<"key: "<<(*empty).key<<" 姓名: "<<(*empty).name_num.name<<" 学号: "<<(*empty).name_num.number<<endl;
while((*empty).next!=nullptr)
{
empty=(*empty).next;
cout<<"key: "<<(*empty).key<<" 姓名: "<<(*empty).name_num.name<<" 学号: "<<(*empty).name_num.number<<endl;
}
}
}
main.h
#include "list.h"
int main()
{
list student_list
student_list.show()
cout<<endl
student_list.insert("范冰冰","010308",1)
student_list.show()
cout<<endl
student_list.insert("黄晓明","010305",2)
student_list.show()
cout<<endl
student_list.insert("赵丽颖","010302",1)
student_list.show()
cout<<endl
student_list.insert("吴彦祖","010301",2)
student_list.show()
cout<<endl
student_list.deletee()
student_list.show()
cout<<endl
student_list.deletee()
student_list.show()
cout<<endl
student_list.insert("古天乐","010312",3)
student_list.show()
cout<<endl
return 0
}
运行结果: