- 论坛徽章:
- 1
|
本帖最后由 framily 于 2015-04-29 12:18 编辑
===================================================
List.h文件,该文件用来设计自己的链表类,并对部分运算符进行了重载
===================================================
#pragma once
typedef struct _STUDENT
{
int number;
char name[20];
float math;
}DATA;
struct _NODE
{
DATA data;
_NODE *prev, *next;
};
class List
{
_NODE *head_, *tail_;
int count_;
public:
class iterator
{
_NODE *p_;
public:
iterator(_NODE *p)
{
this->p_ = p;
}
DATA & operator*()
{
return p_->data;
}
DATA *operator->()
{
return &(p_->data);
}
operator _NODE*()
{
return p_;
}
iterator & operator++()
{
p_ = p_->next;
return *this;
}
iterator operator++(int)
{
iterator iter(p_);
p_ = p_->next;
return iter;
}
iterator operator--()
{
p_ = p_->prev;
return *this;
}
iterator operator--(int)
{
iterator iter(p_);
p_ = p_->prev;
return iter;
}
iterator()
{
}
~iterator()
{
}
};
int size() const
{
return count_;
}
iterator begin() const
{
return head_;
}
iterator end() const
{
return tail_;
}
void push_back(DATA data);
void push_front(DATA data);
void erase(iterator iter);
void clear();
List();
~List();
};
=============================================================
List.cpp 该文件用来具体实现List.h文件中声明的函数
=============================================================
#include "List.h"
void List::push_back(DATA data)
{
_NODE *p = new _NODE;
p->data = data;
if (tail_)
tail_->next = p;
else
head_ = p;
p->prev = tail_;
p->next = nullptr;
tail_ = p;
++count_;
}
void List::push_front(DATA data)
{
_NODE *p = new _NODE;
p->data = data;
if (head_)
head_->prev = p;
else
tail_ = p;
p->next = head_;
p->prev = nullptr;
head_ = p;
++count_;
}
void List::erase(iterator iter)
{
_NODE *p = (_NODE*)iter;
if (p == head_)
head_ = p->next;
else
p->prev->next = p->next;
if (p == tail_)
tail_ = p->prev;
else
p->next->prev = p->prev;
delete p;
--count_;
}
void List::clear()
{
_NODE *p = head_, *q = nullptr;
while (p)
{
q = p;
p = p->next;
delete q;
}
head_ = tail_ = nullptr;
count_ = 0;
}
List::List()
{
head_ = tail_ = nullptr;
count_ = 0;
}
List::~List()
{
clear();
}
==============================================================
Student.h 文件 用来编写学生信息管理类
==============================================================
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include "List.h"
#include <string>
typedef bool(*BY_FUNC)(DATA &q, DATA &m);
typedef List::iterator ITER;
class CStudent
{
List list_;
static bool ByNumb(DATA &q, DATA &m)
{
return q.number < m.number;
}
static bool ByName(DATA &q, DATA &m)
{
return strcmp(q.name, m.name) < 0;
}
static bool ByMath(DATA &q, DATA &m)
{
return q.math > m.math;
}
void Welcome();
int Menu();
int Input();
bool Check(int number);
bool Del();
bool Mod();
int Find();
void FindByID();
void FindByName();
void FindByScore();
int SortMenu();
void Sort(BY_FUNC);
void Print();
void PrintPS(ITER *);
void ColorSet();
void Save();
void Load();
void PrintFind(List &cl);
public:
CStudent();
~CStudent();
void Start();
};
=====================================================
Student.cpp
=====================================================
#include "Student.h"
#include <conio.h>
#include <iostream>
using namespace std;
CStudent::CStudent()
{
}
CStudent::~CStudent()
{
list_.clear();
}
void CStudent::Start()
{
Welcome();
Load();
while (Menu())
;
}
void CStudent::Welcome()
{
system("color 5F" ;
printf("\n\n" ;
printf(" \t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n" ;
printf(" \t┃ *********************************************************┃\n" ;
printf(" \t┃***┏━━━━━━━━━━━━━━━━━━━━━━━━┓***┃\n" ;
printf(" \t┃***┃************************************************┃***┃\n" ;
printf(" \t┃***┃*** ****┃***┃\n" ;
printf(" \t┃***┃*** 欢迎使用学生信息管理系统 ****┃***┃\n" ;
printf(" \t┃***┃*** ****┃***┃\n" ;
printf(" \t┃***┃*** ****┃***┃\n" ;
printf(" \t┃***┃*** ANONYMOUS **** |***┃\n");
printf(" \t┃***┃*** ****┃***┃\n");
printf(" \t┃***┃*** 2015.04.29 ****┃***┃\n");
printf(" \t┃***┃*** ****┃***┃\n");
printf(" \t┃***┃************************************************┃***┃\n");
printf(" \t┃***┗━━━━━━━━━━━━━━━━━━━━━━━━┛***┃\n");
printf(" \t┃ *********************************************************┃\n");
printf(" \t┗━━━━━━━━━━━按任意键继续━━━━━━━━━━━━┛\n");
_getch();
}
int CStudent::Menu()
{
system("cls");
cout << "==================" << endl;
puts("1、浏览所有信息");
puts("2、添加信息");
puts("3、删除信息");
puts("4、修改信息");
puts("5、查找信息");
puts("6、颜色设置");
puts("0、退出");
cout << "==================" << endl;
printf("请选择:");
int i = 0;
scanf_s("%d", &i);
switch (i)
{
case 1:
while (SortMenu())
;
break;
case 2:
while (Input())
;
break;
case 3:
while (Del())
;
break;
case 4:
while (Mod())
;
break;
case 5:
while (Find())
;
break;
case 6:
ColorSet();
break;
}
return i;
}
int CStudent::Input()
{
system("cls");
cout << "请输入学号:";
DATA data;
while (true)
{
cin >> data.number;
if (Check(data.number))
cout << "号码已经存在,请重新输入:";
else
break;
}
cout << "请输入姓名和数学成绩(中间用空格分开):";
cin >> data.name >> data.math;
list_.push_back(data);
Save();
Print();
cout << "继续添加(y/n):";
char c = _getch();
return (c == 'y' || c == 'Y');
}
bool CStudent::Check(int number)
{
ITER iter = list_.begin();
while (iter)
{
if (iter->number == number)
return true;
++iter;
}
return false;
}
bool CStudent: el()
{
system("cls");
Print();
int number;
cout << "请输入要删除的学号:";
cin >> number;
ITER iter = list_.begin();
while (iter)
{
if (iter->number == number)
{
list_.erase(iter);
Print();
cout << "删除成功!" << endl;
puts("");
system("pause");
Save();
return false;
}
++iter;
}
cout << "你输入的学号不存在,是否继续?(y/n):";
char c = _getch();
return ('y' == c || 'Y' == c);
}
bool CStudent::Mod()
{
system("cls");
Print();
int n;
cout << "请输入你要修改的学号:";
cin >> n;
ITER iter = list_.begin();
while (iter)
{
if (iter->number == n)
{
cout << "请输入新的姓名和数学成绩(中间用空格分开):" << endl;
cin >> iter->name >> iter->math;
Print();
cout << "修改成功!" << endl;
Save();
puts("");
system("pause");
return false;
}
++iter;
}
cout << "你要修改的学号不存在!" << endl;
cout << "继续修改?(y/n):";
char c = _getch();
return (c == 'y' || c == 'Y');
}
int CStudent::Find()
{
int n;
system("cls");
cout << "=================" << endl;
cout << "1、按学号查找" << endl;
cout << "2、按姓名查找" << endl;
cout << "3、按分数段查找" << endl;
cout << "0、返回主菜单" << endl;
cout << "=================" << endl;
cout << "请选择:";
cin.clear();
cin.sync();
cin >> n;
switch (n)
{
case 1:
FindByID();
break;
case 2:
FindByName();
break;
case 3:
FindByScore();
break;
default:
break;
}
return n;
}
void CStudent::FindByID()
{
int n;
system("cls");
cout << "请输入您要查找的学号:";
fflush(stdin);
cin >> n;
ITER iter = list_.begin();
while (iter)
{
if (iter->number == n)
{
cout << "===========================" << endl;
cout << "学号\t" << "姓名\t" << "数学成绩" << endl;
cout << "===========================" << endl;
cout << iter->number << "\t" << iter->name
<< "\t" << iter->math << endl;
puts("");
system("pause");
return;
}
++iter;
}
cout << "您所查找的信息不存在!" << endl;
puts("");
system("pause");
}
void CStudent::FindByName()
{
char name[20];
List list;
system("cls");
cout << "请输入您要查找的姓名:";
cin.clear();
cin.sync();
cin >> name;
ITER iter = list_.begin();
while (iter)
{
if (strstr(iter->name, name))
list.push_back(*iter);
++iter;
}
if (list.size())
{
PrintFind(list);
list.clear();
}
else
cout << "没有找到符合条件的学号" << endl;
puts("");
system("pause");
}
void CStudent::FindByScore()
{
float score1;
float score2;
List list;
system("cls");
printf("请输入要查询的分数区间(两个分数之间用空格分开):");
cin.clear();
cin.sync();
cin >> score1 >> score2;
if(score1>score2)
swap(score1, score2);
ITER iter = list_.begin();
while (iter!)
{
if (iter->math > score1 && iter->math < score2)
list.push_back(*iter);
++iter;
}
if (list.size())
{
PrintFind(list);
list.clear();
}
else
cout << "没有找到符合条件的数据" << endl;
puts("");
system("pause");
}
int CStudent::SortMenu()
{
system("cls");
cout << "====================" << endl;
puts("1、按学号排序:");
puts("2、按姓名排序:");
puts("3、按数学成绩排序:");
puts("4、不排序直接浏览:");
puts("0、返回主菜单:");
cout << "====================" << endl;
cout << "请选择:";
int i;
cin >> i;
BY_FUNC ps[] = { ByNumb,ByName,ByMath };
switch (i)
{
case 1:
case 2:
case 3:
Sort(ps[i - 1]);
break;
case 4:
Print();
system("pause");
break;
}
return i;
}
void CStudent::Sort(BY_FUNC func)
{
system("cls");
int n = list_.size(), i = 0;
ITER *iters = new ITER[n + 1];
ITER iter = list_.begin();
while (iters = iter)
{
++i;
++iter;
}
i = 0;
while (i < n - 1)
{
int j = i + 1;
int m = i;
while (j < n)
{
if (func(*iters[j], *iters[m]))
m = j;
++j;
}
if (m != i)
{
ITER t = iters;
iters = iters[m];
iters[m] = t;
}
++i;
}
PrintPS(iters);
delete[]iters;
}
void CStudent: rint()
{
system("cls");
ITER iter = list_.begin();
cout << "===========================" << endl;
cout << "学号\t" << "姓名\t" << "数学成绩" << endl;
cout << "===========================" << endl;
while (iter)
{
cout << iter->number << "\t" << iter->name
<< "\t" << iter->math << endl;
++iter;
}
}
void CStudent: rintPS(ITER *iters)
{
cout << "===========================" << endl;
cout << "学号\t" << "姓名\t" << "数学成绩" << endl;
cout << "===========================" << endl;
int i = 0;
while (iters)
{
cout << iters->number << "\t" << iters->name << "\t"
<< iters->math << endl;
++i;
}
puts("");
system("pause");
}
void CStudent::ColorSet()
{
char str[9] = "color ";
system("cls");
cout << "==============================" << endl;
cout << "0 = 黑色 8 = 灰色" << endl;
cout << "1 = 蓝色 9 = 淡蓝色" << endl;
cout << "2 = 绿色 A = 淡绿色" << endl;
cout << "3 = 浅绿色 B = 淡浅绿色" << endl;
cout << "4 = 红色 C = 淡红色" << endl;
cout << "5 = 紫色 D = 淡紫色" << endl;
cout << "6 = 黄色 E = 淡黄色" << endl;
cout << "7 = 白色 F = 亮白色" << endl;
cout << "==============================" << endl;
cout << "请选择背景色(0-F):";
cin >> str[6];
cout << "请选择前景色(0-F):";
cin >> str[7];
system(str);
}
void CStudent::Save()
{
FILE *pf = fopen("stu.dat", "wb");
if (!pf)
return;
DATA d;
ITER iter = list_.begin();
while (iter != list_.end())
{
d = *iter;
fwrite(&d, 1, sizeof(d), pf);
iter++;
}
fclose(pf);
}
void CStudent::Load()
{
FILE *pf = fopen("stu.dat", "rb");
if (!pf)
return;
DATA d;
while (fread(&d, 1, sizeof(d), pf) == sizeof(d))
list_.push_back(d);
fclose(pf);
}
void CStudent: rintFind(List & list)
{
system("cls");
int i = 0;
ITER iter = list.begin();
cout << "===========================" << endl;
cout << "学号\t" << "姓名\t" << "数学成绩" << endl;
cout << "===========================" << endl;
while (iter)
{
cout << iter->number << "\t" << iter->name << "\t"
<< iter->math << endl;
++iter;
}
}
=====================================================
Source.cpp 定义函数入口
=====================================================
#include "Student.h"
int main()
{
CStudent st;
st.Start();
return 0;
} |
|