近日已经临近考试了,想起啊我还有一个数据结构关于链表的实验未作,昨天折腾了一晚上,但是有个问题还是未解决。
其问题就是:
一个学生的信息:
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();//释放链表
其代码如下:
1#include<iostream>
2#include<string>
3using namespace std;
4class Link;
5/**//*
6**对于学号的问题还在研究中,由于拷贝函数、构造函数用的比较杂,没有实现每次加1,但是链表功能还是实现了
7*/
8class Student{
9 friend class Link;
10public:
11 Student();
12 Student(Student &);
13 Student(char *name,char* sex,int age);
14 void display();
15 Student &operator=(Student &s);
16 ~Student();
17private:
18 char *Name;
19 int age;
20 char *Sex;
21 int no;
22 Student *next;
23 int static Stu_no;
24};
25int Student::Stu_no=2009000;
26Student::Student(){
27 no=Stu_no++;
28 Name=new char[2];
29 strcpy(Name,"X");
30 Sex=new char[4];
31 strcpy(Sex,"Boy");
32 age=20;
33}
34Student::Student(char *name,char* sex,int age){
35 no=Stu_no++;
36 this->age=age;
37 Name=new char[strlen(name)+1];
38 strcpy(Name,name);
39 Sex=new char[strlen(sex)+1];
40 strcpy(Sex,sex);
41}
42Student::Student(Student &s){
43 no=Stu_no++;
44 this->age=s.age;
45 Name=new char[strlen(s.Name)+1];
46 strcpy(Name,s.Name);
47 Sex=new char[strlen(s.Sex)+1];
48 strcpy(Sex,s.Sex);
49 next=new Student;
50}
51Student &Student::operator =(Student &s){
52 this->age=s.age;
53 Name=new char[strlen(s.Name)+1];
54 strcpy(Name,s.Name);
55 Sex=new char[strlen(s.Sex)+1];
56 strcpy(Sex,s.Sex);
57 return *this;
58}
59Student::~Student(){
60 delete []Name;
61 delete []Sex;
62 Stu_no--;
63}
64void Student::display(){
65 cout<<Name<<" "<<no<<" "<<Sex<<" "<<age<<endl;
66}
67class Link{
68public:
69 Link();
70 void Delete(int);
71 void Add(Student& s);
72 void Display();
73 ~Link();
74private:
75 Student *pHead;
76 Student *pTail;
77 Student *pivot;
78};
79Link::Link(){//构造空链表
80 pHead=NULL;;
81 pTail=NULL;
82 pivot=NULL;
83}
84Link::~Link(){//释放内存
85 pivot=pHead;
86 Student *p;
87 while(pivot){
88 p=pivot;
89 pivot=pivot->next;
90 delete p;
91 }
92}
93void Link::Add(Student &s){//向链表中加如学生s
94 if(pHead==NULL){
95 pHead = new Student(s);
96 pTail=pHead;
97 pTail->next=NULL;
98 }
99 else{
100 Student *st=new Student(s);
101 pTail->next=st;
102 pTail=st;
103 pTail->next=NULL;
104 }
105
106}
107void Link::Display(){//显示链表中学生信息
108 pivot=pHead;
109 while(pivot){
110 pivot->display();
111 pivot=pivot->next;
112 }
113 if(pHead)//非空,每次显示一条链表画下划线
114 cout<<"-------------------"<<endl;
115}
116void Link::Delete(int age){//删除链表中所有年龄为age的学生
117 int yes=0;//记录是否有age的学生
118 Student *p=pHead,*q;
119 if(p&&p->age==age){//如果链表首为age删除
120 do{
121 cout<<"删去了";
122 pHead->display();
123 yes=1;
124 pHead=p->next;
125 cout<<"-------------------"<<endl;
126 delete p;
127 p=pHead;
128 }while(p&&p->age==age);
129 }
130 while(p){//其他地方
131 q=p->next;//q为删除的元素,p记录其上一个元素
132 if(q&&q->age==age){
133 p->next=q->next;
134 cout<<"删去了";
135 q->display();
136 yes=1;
137 delete q;
138 cout<<"-------------------"<<endl;
139 }
140 else if(!q&&yes==0){
141 cout<<"没有"<<age<<"岁的学生"<<endl;
142 cout<<"-------------------"<<endl;
143 return;
144 }
145 else
146 p=p->next;
147 }
148}
149void main(){
150 Student s1("X","Boy",22);
151 Student s2("Y","Boy",20);
152 Student s3("Z","Boy",21);
153 Student s4("U","Girl",22);
154 Link l;
155 l.Add(s1);
156 l.Add(s2);
157 l.Add(s3);
158 l.Add(s4);
159 l.Display();
160 l.Delete(21);
161 l.Display();
162}
上述代码已经实现了基本功能,只是学号问题还未解决,由于在链表中对Student进行操作,要构造临时学生,但是怎么就没有及时释放,导致学号问题
posted on 2011-01-08 15:12
あ维wêiセ 阅读(1939)
评论(5) 编辑 收藏 引用 所属分类:
C++