100 鱼币
题 目 二:带表头结点的单链表实现
题目描述:线性表是n( 3 0)个元素a0,a1,…,an-1的有序集合,记为(a0,a1,…,an-1)。其中,n是线性表中元素的个数,称为线性表的长度,n = 0时称为空表。实现线性表有两种存储表示法:顺序存储结构和链式存储结构。设计并实现一个链式存储结构的线性表,即单链表。
基本要求:
1、设计并实现一个带表头结点单链表结构。
2、单表的初始化函数以及增删查改等函数,以及释放每个结点的空间。
3、有简单的交互界面供使用者进行功能测试。
提高要求:
1、如果单链表中存放的不是简单的数据类型(如int型),而是一个结构类型(如一个学生结构)。单链表该如何设计?学生结构如下:
学号 姓名 性别 出生 语文 数学 外语 总分
02070101 张丽 女 1980 90 100 98
02070102 林东妹 女 1982 98 97 87
02070103 赵启南 男 1979 89 94 86
……
2、系统启动时可以从文本文件中读取学生信息构建单链表;系统关闭后,单链表中的学生信息可以保存在文本文件中。
#include <iostream.h>
#include <string.h>
#include <fstream.h>
void menu();
class Student
{
char Name[10];
char sex[10];
int Chinese;
int Maths;
int English;
int total;
int No;
public:
Student();
Student(char *na,char *se,int Ch,int Ma,int En,int to,int no);
~Student();
void Display();
};
Student::Student(char *na,char *se,int Ch,int Ma,int En,int to,int no)
{
strcpy(Name,na);
strcpy(sex,se);
Chinese=Ch;
Maths=Ma;
English=En;
total=Chinese+Maths+English;
No=no;
}
template <class T>
class Node
{
public:
T data;
Node *link;
};
template <class T>
class SingleList
{
private:
int currentSize;
Node<T> *first;
public:
SingleList();
~SingleList();
int Insert();
int Search();
int Delete();
int Modify();
void Display()
{
SingleList *p=first->link;
{
cout<<p->data<<endl;
p=p->link;
}
}
friend istream&operator>>(istream&in,Student&k)
{
in>>k.na;
in>>k.no;
in>>k.se;
in>>k.Ch;
in>>k.Ma;
in>>k.En;
in>>k.to;
return in;
}
friend ostream&operator<<(ostream&out,const Student&k)
{
out>>k.na;
out>>k.no;
out>>k.se;
out>>k.Ch;
out>>k.Ma;
out>>k.En;
out>>k.to;
return out;
}
};
template <class T>
SingleList<T>::SingleList()
{
currentSize = 0;
first = new Node<T>;
first->link = NULL;
}
template <class T>
SingleList<T>::~SingleList()
{
}
template <class T>
int SingleList<T>::Insert(int i, T val)
{
if (i <0 || i > currentSize)
return 0;
Node<T> *p = first;
for (int j = 1; j <=i; ++j)
{
p = p->link;
}
Node<T> *q = new Node<T>;
q->data = val;
q->link = p->link;
p->link = q;
currentSize++;
return 1;
}
template <class T>
int SingleList<T>::Delete(int i)
{
if (i <0 || i > currentSize)
cout<<"找不到您要的信息"<<endl;
return 0;
Node<T> *p = first;
for (int j = 1; j <=i; ++j)
{
p = p->link;
}
q->link = p;
q->link = p->link;
delete p;
currentSize--;
return 1;
}
template <class T>
int SingleList<T>::Modify(int i,T val)
{
if (i <0 || i > currentSize)
cout<<"找不到您要的信息"<<endl;
return 0;
Node<T> *p = first;
for (int j = 1; j <=i; ++j)
{
p = p->link;
}
q->data = val;
return 1;
}
template <class T>
int SingleList<T>::Search(int i)
{
if(i<0||i>currentSize)
cout<<"找不到您需要的信息"<<endl;
return 0;
Node<T> *p = first;
for (int j = 1; j <=i; ++j)
{
p = p->link;
}
return 1;
}
int main()
{
SingleList<Student> sl;
Student a;
ifstream data("data.txt");
data >> a.no;
data >> a.na;
data >> a.se;
data >> a.Ch;
data >> a.Ma;
data >> a.En;
data >> a.to;
sl.Insert();
sl.Delete();
sl.Modify();
sl.Search();
do
{
menu();
int choice;
cin>>choice;
switch(choice)
{
case 1:sl.Insert(); break;
case 2:cout<<"请输入您要删除的学号"<<endl;
int de;
cin>>de;
sl.Delete(de);
break;
case 3:cout<<"请输入您要修改的学号"<<endl;
int mo;
cin>>mo;
sl.Modify(mo);
break;
case 4:cout<<"请输入您要查询的学号"<<endl;
int s;
cin>>s;
sl.Search(s);
a.Display();
break;
case 5:break;
}
}
/*data >> a.Name;
data >> a.No;
sl.Insert(0, a);
data >> a.Name;
data >> a.No;
sl.Insert(0, a);
strcpy(a.Name, "zhangsan");
a.No = 20;
sl.Insert(0, a);
strcpy(a.Name, "lisi");
a.No = 30;
sl.Insert(1, a);
strcpy(a.Name, "wang");
a.No = 40;
sl.Insert(2, a);
*/
return 0;
}
void menu()
{
cout<<"*****请输入您的选择*****"<<endl;
cout<<"*****1.插入学生信息*****"<<endl;
cout<<"*****2.删除学生信息*****"<<endl;
cout<<"*****3.修改学生信息*****"<<endl;
cout<<"*****4.查找学生信息*****"<<endl;
cout<<"*****5.退出学生系统*****"<<endl;
}
我来回答