#ifndef SEQLIST_H
#define SEQLIST_H
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
const int MAXSIZE=100;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
class Student{
public:
string name;
string id;
double score;
Student(string _name="NULL", string _id="NULL", double _score=0)
{
name=_name;
id=_id;
score=_score;
}
void Show()
{
cout <<"|"<<id<< setw(16 - (int)id.size()) << "|" << name << setw(16 - (int)name.size()) << "|" << score<<setw(15)<<setfill(' ') <<"\n";
}
void ShowOnly()
{
cout<<endl;
cout<<"姓名:"<<name<<'\n'<<"学号"<<id<<'\n'<<"成绩"<<score<<'\n';
}
};
class SeqList{
public:
Student *s;
int length;
SeqList(){}
int InitList();
int BuildList(int _length);
void TraverseList();
int FindId(string _name);
int GetElem(int i);
int ListInsert(int i, string _name, string _id, double _score);
int ListDelete(int i);
int ListLength();
};
#endif
#include"SeqList.h"
int SeqList::BuildList(int _length)
{
if(_length<0) return ERROR;
for(int i=0; i<_length; i++)
{
cout<<"请输入学生姓名: ";
cin>>s[i].name;
cout<<"请输入学生学号: ";
cin>>s[i].id;
cout<<"请输入学生成绩: ";
cin>>s[i].score;
cout<<endl;
}
length=_length;
cout<<"建立完成!"<<endl;
return OK;
}
void SeqList::TraverseList()
{
cout <<"|-----------------------------------------------\n";
cout <<"|id-------------|name-----------|score----------\n";
for(int i = 0; i < length; i++){
s[i].Show();
}
cout <<"------------------------------------------------\n";
}
int SeqList::InitList()
{
s = new Student[MAXSIZE];
if(s==NULL) return ERROR;
length=0;
return OK;
}
int SeqList::FindId(string _name)
{
for(int i=0; i<length; i++)
{
if(s[i].name==_name)
{
s[i].ShowOnly();
return OK;
}
}
return ERROR;
}
int SeqList::GetElem(int i)
{
if(i>length || i<0) return ERROR;
s[i-1].ShowOnly();
return OK;
}
int SeqList::ListInsert(int i, string _name, string _id, double _score )
{
if(i<=0 || i>length+1) return ERROR;
else
{
Student temp(_name, _id, _score);
for(int j=length-1; j>=i-1; j--)
{
s[j+1]=s[j];
}
s[i-1]=temp;
}
length++;
return OK;
}
int SeqList::ListDelete(int i)
{
if(i<0 || i>length) return ERROR;
else
{
for(int j=i-1; j<length; j++)
s[i-1]=s[i];
}
length--;
return OK;
}
int SeqList::ListLength()
{
return length;
}
#include"SeqList.h"
SeqList L;
void Display();
void Test();
int main()
{
L.InitList();
Display();
Test();
return 0;
}
void Display()
{
cout<<"|----------------------------------|"<<endl;
cout<<"1:构建一个指定长度的顺序表 |"<<endl;
cout<<"2:输出顺序表的所有信息 |"<<endl;
cout<<"3:根据姓名查找学生的学号和成绩: |"<<endl;
cout<<"4:根据指定位置返回相应的学生信息 |"<<endl;
cout<<"5:将一个学生的信息插入到指定位置 |"<<endl;
cout<<"6:删除指定位置的学生信息 |"<<endl;
cout<<"7:统计表中学生的个数 |"<<endl;
cout<<"|----------------------------------|"<<endl;
}
void Test()
{
L.InitList();
int Function;
int x;
string n;
string i;
double s;
int _length;
while(cin>>Function)
{
switch(Function)
{
case 1:
cout<<"请输入表长:";
cin>>_length;
if(!L.BuildList(_length)) cout<<"表长输入错误";
break;
case 2:
L.TraverseList();
break;
case 3:
cout<<"请输入学生的姓名:";
cin>>n;
if(!L.FindId(n)) cout<<"没找到这个该名学生,是否输入错误";
break;
case 4:
cout<<"请输入需要查找的学生的位置x:";
cin>>x;
if(!L.GetElem(x)) cout<<"输入的x超过了最大的学生数量或者x为负数";
break;
case 5:
cout<<"请输入插入的位置x:";
cin>>x;
cout<<endl;
cout<<"请输入学生的姓名:";
cin>>n;
cout<<"请输入学生的学号:";
cin>>i;
cout<<"请输入学生的成绩:";
cin>>s;
if(!L.ListInsert(x,n,i,s)) cout<<"输入的x超过了最大的学生数量,或者x是负数";
break;
case 6:
cout<<"请输入需要删除的学生的位置:";
cin>>x;
if(!L.ListDelete(x)) cout<<"输入的位置超过了最大学生数量,或者输入了负数";
break;
case 7:
cout<<"学生的总数为:";
cout<<L.ListLength()<<endl;
break;
default: break;
}
}
}
#ifndef LINKLIST_H
#define LINKLIST_H
#include<iomanip>
#include<iostream>
#include<cstdio>
#define ERROR 0;
#define OK 1;
const int MAXSIZE=1000;
using namespace std;
typedef struct Student{
string name;
string id;
double score;
}ElemType;
typedef struct LNode{
ElemType data;
LNode *next;
}LNode;
class LinkList{
private:
LNode *head;
public:
LinkList();
virtual ~LinkList();
void ClearList();
int InitList();
int BuildList(int _length);
void TraverseList();
int FindId(ElemType e);
int GetElem(int i);
int ListInsert(int i, ElemType &e);
int ListDelete( int i);
int ListLength();
};
#endif
#include"LinkList.h"
LinkList::LinkList(){
head=new LNode;
head->next=NULL;
}
LinkList::~LinkList(){
LNode *p=head->next, *q;
while(p)
{
q=p->next;
delete p;
p=q;
}
delete head;
}
void LinkList::TraverseList()
{
LNode *p=head->next;
cout <<"|-----------------------------------------------\n";
cout <<"|id-------------|name-----------|score----------\n";
while(p)
{
cout <<"|"<<p->data.id<< setw(16 - (int)p->data.id.size()) << "|" << p->data.name << setw(16 - (int)p->data.name.size()) << "|" << p->data.score<<setw(15)<<setfill(' ') <<"\n";
p=p->next;
}
cout <<"------------------------------------------------\n";
}
int LinkList::FindId(ElemType e)
{
LNode *p;
p=head->next;
while(p && p->data.name!=e.name)
{
p=p->next;
}
if(p==NULL)
{
return ERROR;
}
else
{
cout<<"学号:"<<p->data.id<<"姓名:"<<p->data.name<<"成绩:"<<p->data.score;
return OK;
}
}
int LinkList::GetElem(int i)
{
LNode *p;
p=head->next;
int j=1;
while(p && j<i)
{
p=p->next;
j++;
}
if(!p || j>i)
{
cout<<"单链表不存在该位置的元素,是否输入错误";
return ERROR;
}
else
{
cout<<"学号"<<p->data.id<<"姓名"<<p->data.name<<"成绩"<<p->data.score<<endl;
return OK;
}
}
void LinkList::ClearList()
{
LNode *p=head->next;
LNode *q;
while(p)
{
q=p->next;
delete p;
p=q;
}
head->next=NULL;
}
int LinkList::BuildList(int _length)
{
LNode *s;
ElemType e;
ClearList();
if(_length>MAXSIZE || _length<0) return ERROR;
for(int i=0; i<_length; i++)
{
cout<<"请输入学生姓名:";
cin>>e.name;
cout<<"请输入学生id:";
cin>>e.id;
cout<<"请输入学生成绩:";
cin>>e.score;
cout<<endl;
s=new LNode;
s->data=e;
s->next=head->next;
head->next=s;
}
cout<<"链表创建完成!"<<endl;
return OK;
}
int LinkList::ListInsert(int i,ElemType &e)
{
LNode *s, *p;
int j=0;
p=head;
while(p && j<i-1)
{
p=p->next;
j++;
}
if(!p || j>i) return ERROR;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
int LinkList::ListDelete(int i)
{
LNode *p,*s;
int j=0;
while(p->next && j<i-1)
{
p=p->next;
j++;
}
if(!(p->next) && (j>i-1)) return ERROR;
s=p->next;
p->next=s->next;
delete s;
return OK;
}
int LinkList::ListLength()
{
LNode *p;
int i=0;
p=head->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
#include"LinkList.h"
void Display();
void Test();
int main()
{
Display();
Test();
return 0;
}
void Display()
{
cout<<"|----------------------------------|"<<endl;
cout<<"1:构建一个指定长度的单链表 |"<<endl;
cout<<"2:输出单链表的所有信息 |"<<endl;
cout<<"3:根据姓名查找学生的学号和成绩: |"<<endl;
cout<<"4:根据指定位置返回相应的学生信息 |"<<endl;
cout<<"5:将一个学生的信息插入到指定位置 |"<<endl;
cout<<"6:删除指定位置的学生信息 |"<<endl;
cout<<"7:统计表中学生的个数 |"<<endl;
cout<<"|----------------------------------|"<<endl;
}
void Test()
{
LinkList list;
int Function;
int x;
int _length;
ElemType e;
while(cin>>Function)
{
switch(Function)
{
case 1:
cout<<"请输入表长:";
cin>>_length;
if(!list.BuildList(_length)) cout<<"表长输入不合法";
cout<<"建立完成!"<<endl;
break;
case 2:
list.TraverseList();
break;
case 3:
cout<<"请输入学生的姓名:";
cin>>e.name;
if(!list.FindId(e)) cout<<"没找到这个该名学生,是否输入错误";
break;
case 4:
cout<<"请输入需要查找的学生的位置x:";
cin>>x;
if(!list.GetElem(x)) cout<<"输入的x超过了最大的学生数量或者x为负数";
break;
case 5:
cout<<"请输入插入的位置x:";
cin>>x;
cout<<endl;
cout<<"请输入学生的姓名:";
cin>>e.name;
cout<<"请输入学生的学号:";
cin>>e.id;
cout<<"请输入学生的成绩:";
cin>>e.score;
if(!list.ListInsert(x, e)) cout<<"输入的x超过了最大的学生数量,或者x是负数";
break;
case 6:
cout<<"请输入需要删除的学生的位置:";
cin>>x;
if(!list.ListDelete(x)) cout<<"输入的位置超过了最大学生数量,或者输入了负数";
break;
case 7:
cout<<"学生的总数为:";
cout<<list.ListLength()<<endl;
break;
default: break;
}
}
}