近日已经临近考试了,想起啊我还有一个数据结构关于链表的实验未作,昨天折腾了一晚上,但是有个问题还是未解决。
其问题就是:
一个学生的信息:
1、姓名
2、学号
3、性别
4、年龄
用一个链表将其连接起来,从外界输入一个年龄,将与该年龄一样的学生全从链表中删除
分析:对于该实验给出一个
ADT student
操作对象:其基本信息(私有成员变量)
基本操作:
student();//构造默认参数学生
student(char *name,char *sex,int age);//构造指定参数的学生
~student()://删除学生
display();//显示学生信息
student &operator=(student &s);//重载=用于后面链表的赋值
对于链表的结构
ADT Link
操作对象:学生Student
Link()//构造空表
Delete()//删除一个元素
Add(Student &s)//向链表中添加s
Display()//显示链表
~Link();//释放链表
其代码如下:
#include<iostream>
#include<string>
using namespace std;
class Link;
/*
**对于学号的问题还在研究中,由于拷贝函数、构造函数用的比较杂,没有实现每次加1,但是链表功能还是实现了
*/
class Student{
friend class Link;
public:
Student();
Student(Student &);
Student(char *name,char* sex,int age);
void display();
Student &operator=(Student &s);
~Student();
private:
char *Name;
int age;
char *Sex;
int no;
Student *next;
int static Stu_no;
};
int Student::Stu_no=2009000;
Student::Student(){
no=Stu_no++;
Name=new char[2];
strcpy(Name,"X");
Sex=new char[4];
strcpy(Sex,"Boy");
age=20;
}
Student::Student(char *name,char* sex,int age){
no=Stu_no++;
this->age=age;
Name=new char[strlen(name)+1];
strcpy(Name,name);
Sex=new char[strlen(sex)+1];
strcpy(Sex,sex);
}
Student::Student(Student &s){
no=Stu_no++;
this->age=s.age;
Name=new char[strlen(s.Name)+1];
strcpy(Name,s.Name);
Sex=new char[strlen(s.Sex)+1];
strcpy(Sex,s.Sex);
next=new Student;
}
Student &Student::operator =(Student &s){
this->age=s.age;
Name=new char[strlen(s.Name)+1];
strcpy(Name,s.Name);
Sex=new char[strlen(s.Sex)+1];
strcpy(Sex,s.Sex);
return *this;
}
Student::~Student(){
delete []Name;
delete []Sex;
Stu_no--;
}
void Student::display(){
cout<<Name<<" "<<no<<" "<<Sex<<" "<<age<<endl;
}
class Link{
public:
Link();
void Delete(int);
void Add(Student& s);
void Display();
~Link();
private:
Student *pHead;
Student *pTail;
Student *pivot;
};
Link::Link(){//构造空链表
pHead=NULL;;
pTail=NULL;
pivot=NULL;
}
Link::~Link(){//释放内存
pivot=pHead;
Student *p;
while(pivot){
p=pivot;
pivot=pivot->next;
delete p;
}
}
void Link::Add(Student &s){//向链表中加如学生s
if(pHead==NULL){
pHead = new Student(s);
pTail=pHead;
pTail->next=NULL;
}
else{
Student *st=new Student(s);
pTail->next=st;
pTail=st;
pTail->next=NULL;
}
}
void Link::Display(){//显示链表中学生信息
pivot=pHead;
while(pivot){
pivot->display();
pivot=pivot->next;
}
if(pHead)//非空,每次显示一条链表画下划线
cout<<"-------------------"<<endl;
}
void Link::Delete(int age){//删除链表中所有年龄为age的学生
int yes=0;//记录是否有age的学生
Student *p=pHead,*q;
if(p&&p->age==age){//如果链表首为age删除
do{
cout<<"删去了";
pHead->display();
yes=1;
pHead=p->next;
cout<<"-------------------"<<endl;
delete p;
p=pHead;
}while(p&&p->age==age);
}
while(p){//其他地方
q=p->next;//q为删除的元素,p记录其上一个元素
if(q&&q->age==age){
p->next=q->next;
cout<<"删去了";
q->display();
yes=1;
delete q;
cout<<"-------------------"<<endl;
}
else if(!q&&yes==0){
cout<<"没有"<<age<<"岁的学生"<<endl;
cout<<"-------------------"<<endl;
return;
}
else
p=p->next;
}
}
void main(){
Student s1("X","Boy",22);
Student s2("Y","Boy",20);
Student s3("Z","Boy",21);
Student s4("U","Girl",22);
Link l;
l.Add(s1);
l.Add(s2);
l.Add(s3);
l.Add(s4);
l.Display();
l.Delete(21);
l.Display();
}
但是学生学号问题没解决...
分享到:
相关推荐
链表类 c++ 实现的 链表类 c++ 实现的 链表类 c++ 实现的
实现功能: void CreateList(T a[], int n); // 由a数组中的元素建造顺序表 void DispList(); // 输出顺序表L中的所有元素 int ListLength(); // 求顺序表的长度 bool GetElem(int i, T &e); // 求顺序表中某序列号...
定义结构体类型,使用动态链表结构编程实现学生 管理系统如下功能: (1)录入每个学生的基本信息; (2)计算每个学生的平均分; (3)按平均分从高到低输出学生信息; (4)按学生姓名的字典顺序输出学生基本信息; (5)按...
c++,算法链表实现一元多项式相加,通过链表实现,非常好的一个程序
C++_循环链表实现约瑟夫问题 vc2008 课堂作业!
学习尝试,代码不完美,请多包涵
代码基于标准C++,可以用vscode,vs,qt等IDE打开。具备基本的双链表操作,如头插尾插,前驱遍历和后继遍历,求长度等等。
C++设计异秩链表实现学校人员的信息管理vs2008
C++实现双链表的操作 C++实现双链表的操作 C++实现双链表的操作
C++进阶学习——单向链表的实现,相关教程链接如下: http://blog.csdn.net/tennysonsky/article/details/49685199
链表的c++实现链表的c++实现链表的c++实现
C++类实现链表,定义ListNode和LinkedList两个类实现了链表的创建,插入,删除操作等。
c++链表队列的实现,c++链表队列的实现,c++链表队列的实现,c++链表队列的实现,c++链表队列的实现,c++链表队列的实现
使用c++实现的一个异质链表,主要介绍在c++中异质链表的实现方式,异质链表的好处……
C++链表基于类实现多项式的加法和乘法; C ++ list class-based polynomial addition and multiplication.
开发类C++类 实现 链表,栈的代码 ,用C++类来实现数据结构中的基本抽象数据类型
C++实现的链表
用C++实现的顺序链表,简单易懂,适合初学者
用C++实现逆置链表 //尾插法建立带表头结点的单链表 Linklist *CreateLinklist() { Elemtype value; Linklist *head,*rear; rear=head=new Linklist; cout请输入链表,以0为结尾: "; cin>>value; while(value!...
双向循环链表 C++实现 双向循环链表 C++实现 双向循环链表 C++实现 双向循环链表 C++实现 双向循环链表 C++实现