您的位置:首页 > 理论基础 > 数据结构算法

高校社团助手

2016-09-01 22:05 190 查看
#include"iostream"
#include"string"
#include"windows.h"
#include<fstream>
#include<iomanip>
#define MAXs 30
#define MAX 10000000
#define MAX_VERTEX_NUM 20
using namespace std;
/*1

实验五 高校社团助手设计与实现
实验要求:
1、
项目服务对象 : 高校社团负责人或管理人员;高校校方社团管理机构负责人
项目功能 : 该项目共实现了8个功能模块.
实验内容:
模块一:通讯录管理
包含建立通讯录、查询、插入、删除、排序、查找等功能。
模块二:成员等级管理
对成员的积分进行管理,通过活动获得积分,若违规则相应扣除积分,积分达到设定的阈值,可实现成员等级的变迁。包括积分添加、修改、查询、排序、求平均分等各种操作。
模块三:社团基本信息管理
对社团名称,口号,宗旨,章程,发起人,社团性质等信息增删改操作。
模块四:组织机构管理
成员人事管理:招新,退社等操作;干部管理:选举等操作;
机构管理:完成社团组织机构的创建、修改、删除、查询等功能。
模块五:赞助商管理
赞助商基本信息的增删改操作;赞助商与社团关系的管理。
模块六:活动计划管理
可行性分析
模块七:活动筹备管理
拉赞助,活动经费与场地,校园导航
模块八:活动评价管理
对每次活动的参与人员评分并总结。*/
struct Level
{
int socre;
string name;
string No;
string level;
void show()
{
cout<< No<<setw(8) <<name << setw(8) <<socre << setw(8) << level <<endl;
}
};
typedef struct
{
string ActivityName;
int Peopelsum;
int Socre;
void showe()
{
cout << ActivityName<< setw(8)<<Peopelsum<<setw(14) << Socre<<endl;
}
}Activity;
typedef struct
{
Activity *base;
int length;
}AList;

typedef struct
{
string *Bases;
int Lengthes;
}PList;
class Map {
public:
Map() {
Read("Map.txt");
}
~Map() {
for (int i = 0; i < MAXs; i++)
{
for (int j = 0; j < MAXs; j++)
{
D[i][j] = 0;
arcs[i][j] = 0;

}
vexs[i] = "";
}
}
void Read(char *FileName);
int LocateVex(string x) { int i; for (i = 0; i < VexNum; ++i)if (vexs[i] == x)return i; return -1; }
void Path(int i, int j)
{
if (i >= 26 || j >= 26 || i*j<0)
{
cout << "错误的地点" << endl;
return;
}
bool p[100];
int k, n, m = i;
int a;
if (i == j)
{
cout << "\t已到达" << endl;
return;
}
if (i != j)
for (k = 0; k < VexNum; k++)
p[k] = P[i][j][k];

cout << endl;
if (D[i][j] < 10000)
{
while (m != j)
{
a = 10000;
for (k = 0; k < VexNum; k++)
if (arcs[m][k] < a&&p[k])
{
a = arcs[m][k];
n = k;
}
cout << vexs
;
if (n != j)
cout << "->";
p
= false;
m = n;
}
cout << " : " << D[i][j] << "米" << endl;
}
else
cout << vexs[i] << "->" << vexs[j] << "没有路" << endl;
}

void ShortestPath_FLOYD()
{
int u, v, w, i;
for (v = 0; v < VexNum; v++)
for (w = 0; w < VexNum; w++)
{
D[v][w] = arcs[v][w];
for (u = 0; u < VexNum; u++)
P[v][w][u] = false;
if (D[v][w] < 10000)
P[v][w][v] = P[v][w][w] = true;
}
for (u = 0; u < VexNum; u++)
for (v = 0; v < VexNum; v++)
for (w = 0; w < VexNum; w++)
if (D[v][u] < 10000 && D[u][w] < 10000 && D[v][u] + D[u][w] < D[v][w])
{
D[v][w] = D[v][u] + D[u][w];
for (i = 0; i < VexNum; i++)
P[v][w][i] = P[v][u][i] || P[u][w][i];
}
}
void Findway();
private:
bool P[MAXs][MAXs][MAXs];
int D[MAXs][MAXs];
int VexNum;
string vexs[MAXs];
int ArcNum;
int arcs[MAXs][MAXs];
};
struct Sponser
{
string SponserName;
int Money;
void shows()
{
cout << SponserName << setw(15) << Money << endl;
}
};
typedef struct
{
Sponser*Base;
int Lengths;
}SList;
void Map::Read(char *FileName)
{
int i, j, k;
string v1, v2;
int w = 0;
ifstream fin;

fin.open(FileName, ios::in);

fin >> VexNum;

for (int i = 0; i < VexNum; i++)
{
fin >> vexs[i];
}

fin >> ArcNum;
for (i = 0; i < VexNum; i++)
for (j = 0; j < VexNum; j++)
arcs[i][j] = 10000;
for (int i = 0; i < VexNum; i++)
arcs[i][i] = 0;
for (int k = 0; k < ArcNum; ++k)
{
fin >> v1 >> v2 >> w;
i = LocateVex(v1);
j = LocateVex(v2);
arcs[i][j] = w;
arcs[j][i] = w;
}

fin.close();
}
//校园导航
void Map::Findway()
{
ShortestPath_FLOYD();
int i, j, q = 1;

cout << endl << "地址如下" << endl;
for (i = 0; i < VexNum; i++)
{
cout.setf(ios::left);
cout << setw(2) << i << ":" << setw(10) << vexs[i] << "  ";
if (i % 4 == 5)
cout << endl;
}
cout << endl;
while (q)
{
cout << "1:开启导航 " << endl;
cout << "0:退出" << endl;
cin >> q;
if (q)
{
cout << "输入导航的起点和终点 : " << endl;
cin >> i >> j;
Path(i, j);
}
}
}

class ListMembers
{
public:
ListMembers()
{
Root = new Leveltree();
m_pHead = new Member(1);
m_pTail = m_pHead;
Alist.base = new Activity[MAXs];
Slist.Base = new Sponser[MAXs];
Alist.length = 1;
Slist.Lengths = 1;
Plist.Bases = new string[MAXs];
Plist.Lengthes = 1;
}
~ListMembers()
{
for (Member* pNode = m_pHead, *pNext; pNode; pNode = pNext)
{
pNext = pNode->m_pNext;
delete pNode;
}
}
bool AddSponser()
{
Sponser S;
cout << "请输入赞助商名:" << endl;
cin >> S.SponserName;
cout << "请输入赞助总金额:" << endl;
cin >> S.Money;
Slist.Base[Slist.Lengths] = S;
Slist.Lengths++;
return true;
}
bool AddActivity()
{
Activity A;
cout << "请输入活动名称:" << endl;
cin >> A.ActivityName;
cout << "请输入活动限制人数:" << endl;
cin >> A.Peopelsum;
cout << "请输入活动分数:" << endl;
cin >> A.Socre;
Alist.base[Alist.length] = A;
Alist.length++;
return true;
}
bool AddPinjia()
{
string S;
cout << "请发表你的意见:" << endl;
cin >> S;
Plist.Bases[Plist.Lengthes] = S;
Plist.Lengthes++;
return true;
}

bool DeleteSponser()
{
int i;
cout << "请输入要删除赞助商的序号:" << endl;
cin >> i;
for (int j = i+1; j < Slist.Lengths; j++)
{
Slist.Base[j - 1] = Slist.Base[j];

}
--Slist.Lengths;
return true;
}
bool DeleteActivity()
{
int i;
cout << "请输入要删除活动的序号:" << endl;
cin >> i;
for (int j = i+1; j < Alist.length; j++)
{
Alist.base[j - 1] = Alist.base[j];
}
--Alist.length;
return true;
}
void showSponser()
{
cout << "赞助商" << setw(8)<<"      " << "赞助总金额" <<endl;
for (int i = 1; i < Slist.Lengths; i++)
{
cout <<"第"<<i<<"个:"; Slist.Base[i].shows();
}
}
void showPinjia()
{
for (int i = 1; i < Plist.Lengthes; i++)
{
cout << "第" << i << "个人评价:"; cout << Plist.Bases[i] << endl;
}
}
int GetMoney()
{
int moneys=0;
for (int i = 1; i < Slist.Lengths; i++)
{
moneys+= Slist.Base[i].Money;
}
return moneys;
}
bool GiveMoney()
{
int money;
int i = 1;
while (i != 0)
{
if (Slist.Lengths == 1) { cout << "没有赞助商!" << endl; return false; }
showSponser();
cout << "请输入要投资赞助商:" << endl;
cin >> i;
switch (i)
{
case 1:cout << "请输入赞助金额:"; cin >> money; if (Slist.Base[1].Money < money) { cout << "钱不够!" << endl; return false; }
else { Slist.Base[1].Money -= money; return true; }
case 2:cout << "请输入赞助金额:"; cin >> money; if (Slist.Base[1].Money < money) { cout << "钱不够!" << endl; return false; }
else { Slist.Base[1].Money -= money; return true; }
case 3:cout << "请输入赞助金额:"; cin >> money; if (Slist.Base[1].Money < money) { cout << "钱不够!" << endl; return false; }
else { Slist.Base[1].Money -= money; return true; }
case 4:cout << "请输入赞助金额:"; cin >> money; if (Slist.Base[1].Money < money) { cout << "钱不够!" << endl; return false; }
else { Slist.Base[1].Money -= money; return true; }
case 5:cout << "请输入赞助金额:"; cin >> money; if (Slist.Base[1].Money < money) { cout << "钱不够!" << endl; return false; }
else { Slist.Base[1].Money -= money; return true; }
case 6:cout << "请输入赞助金额:"; cin >> money; if (Slist.Base[1].Money < money) { cout << "钱不够!" << endl; return false; }
else { Slist.Base[1].Money -= money; return true; }
default:break;
}
return false;
}
}
void showActivity()
{
cout << "活动名" <<"       " << "限制人数" <<"       "<< "活动积分
105f0
" <<  endl;
for (int i = 1; i < Alist.length; i++)
{
cout << "第" << i << "个:"; Alist.base[i].showe();
}
}
void CleerPingjia()
{
Plist.Lengthes = 0;
}
void Baoming()
{
Level T;
string no;
int socres;
int n;
cout << "请输入参加的活动序号:" << endl;
cin >> n;
cout << "请输入参加活动的学号和积分" << endl;
cin >> no >> socres;
T=Root->deletetree(Root,no,socres);
T.socre += Alist.base
.Socre;
Root->insert(T);

}
//接口:追加
void Addend()
{
Member* pNode = new Member(m_pTail);
pNode->Setmebmer();
Level N;
N.name = pNode->M_sName;
N.No = pNode->M_sNo;
cout << "*******************请输入成员的积分******************" << endl;
cin >> N.socre; system("cls");
if (N.socre <= 50)
{
pNode->SetPost("一级");
N.level = "一级";
}
else if (N.socre <= 100)
{
pNode->SetPost("二级");
N.level = "二级";
}
else if ( N.socre <= 150)
{
pNode->SetPost("三级");
N.level = "三级";
}
else
{
pNode->SetPost("四级");
N.level = "四级";
}
if (m_pHead->m_pNext!=NULL)
{
cout << "come" << endl;
pNode->m_pPrev->m_pNext = pNode;
pNode->m_pNext = NULL;
}
else
{
m_pHead->m_pNext=pNode  ;
pNode->m_pPrev = m_pHead;
pNode->m_pNext = NULL;
}
m_pTail = pNode;
pNode->Sort(m_pHead);
Root->insert(N);
}

void Insert() //利用尾插法向双向链表中插入1个(默认)或n个(用户指定)结点
{
Member *t;
if (m_pHead->m_pNext == NULL)    //查找尾结点
t = m_pHead;
else
{
t = m_pHead->m_pNext;
while (t->m_pNext != NULL)
t = t->m_pNext;
}
Member *p = 0;
p = new Member(1);
p->Setmebmer();
t->m_pNext = p;
p->m_pPrev = t;
p->m_pNext = NULL;
t = t->m_pNext;
m_pTail = p;
p->Sort(m_pHead);
}
void TravelTree()
{
int n=1;
while (n != 0)
{
cout << "1.升序;2.降序" << endl;
cin >> n; system("cls");
switch (n)
{
case 1:	cout << "学号" << "        " << "姓名" << "        " << "积分" << "        " << "等级" << "        " << endl; Root->inorder(Root); system("pause");
system("cls"); break;
case 2:	cout << "学号" << "        " << "姓名" << "        " << "积分" << "        " << "等级" << "        " << endl; Root->rinorder(Root); system("pause");
system("cls"); break;
default:break;
}
}
}
void  Search()
{
int n = 1;
while (n != 0)
{
cout << "1.姓名查找;2.学号查找";
cin >> n;
switch (n)
{
case 1:searchname(); break;
case 2:searchno(); break;
default:break;
}
}

}
void searchno()
{
string no;
cout << "请输入查找的学号:"; cin >> no;
for (Member* pFind = m_pHead->m_pNext; pFind; pFind = pFind->m_pNext)
if (pFind->M_sNo == no)
{
pFind->show();
}
else if (pFind == NULL)
{
cout << "查无此人!" << endl;
}
}
void searchname()
{
string name;
cout << "请输入查找的姓名:"; cin >> name;
for (Member* pFind = m_pHead->m_pNext; pFind; pFind = pFind->m_pNext)
if (pFind->M_sName == name)
{
pFind->show();
}
else if (pFind == NULL)
{
cout << "查无此人!" << endl;
}
}
//接口:删除

void Delete()
{
string no;
cout << "请输入要删除的成员学号:";
cin >> no;
for (Member* pFind = m_pHead->m_pNext; pFind; pFind = pFind->m_pNext)
if (pFind->M_sName == no)
{
if (pFind->m_pPrev)
pFind->m_pPrev->m_pNext = pFind->m_pNext;
else
m_pHead = pFind->m_pNext;
if (pFind->m_pNext)
pFind->m_pNext->m_pPrev = pFind->m_pPrev;
else
m_pTail = pFind->m_pPrev;
delete pFind;
return;
}

}
void DeleteTree()
{
Root->deletetree(Root);
}

//接口:遍历
void Travel()
{
cout << "学号:" << setw(8) << "姓名:" << setw(8) << "性别:" << setw(8) << "班级:" << setw(8) << "职务:" << setw(8) << "入社时间:" << setw(8) << "手机:" << setw(8)<< endl;
for (Member* pNode = m_pHead->m_pNext; pNode; pNode = pNode->m_pNext)
{
cout << pNode->M_sNo<<setw(8)<< pNode->M_sName << setw(8) << pNode->M_sSex << setw(8) << pNode->M_sClass << setw(8) << pNode->M_sPost << setw(8) << pNode->M_sTime << setw(8) << pNode->M_sTele << setw(8) << endl;
}
system("pause");
system("cls");
}

private:

class Leveltree
{
public:
Leveltree *left;
Leveltree *right;
Level L;
Leveltree() :left(NULL), right(NULL)
{
L.name = "周恬";
L.No = "0154075";
L.socre =5000;
L.level = "四级";
}
Leveltree(Level T) :left(NULL), right(NULL)
{
L = T;
}
~Leveltree()
{
if (left)
delete left;
if (right)
delete right;
}

void insert(Level a)
{
if (a.socre<=L.socre && left)
{
left->insert(a);
}
else if (a.socre <=L.socre && !left)
{
left = new Leveltree(a);
}
else if (a.socre > L.socre && right)
{
right->insert(a);
}
else if (a.socre>L.socre && !right)
{
right = new Leveltree(a);
}

}
Leveltree* binary_search(Leveltree* point, string node,int socres, int *postion)
{

Leveltree* parent;

parent = point;
*postion = 0;

while (point != NULL)
{
if (point->L.No == node)
return parent;
else
{
parent = point;
if (point->L.socre>socres)
{
point = point->left;
*postion = -1;
}
else
{
point = point->right;
*postion = 1;
}
}

}
return NULL;

}
Level  deletetree(Leveltree*  root,string node, int socres)
{
Level T;
Leveltree*  parent;
Leveltree*  point = new Leveltree;
Leveltree*  child;
int postion;
parent = binary_search(root, node, socres, &postion);

//二叉树为空的情况
if (parent == NULL)
return T;
else
{
switch (postion)
{
case -1:point = parent->left; T = point->L ; break;

case 1:point = parent->right;  T = point->L; break;

case  0:point = parent;  T = point->L; break;
}

if (point->left == NULL&&point->right == NULL)
{
switch (postion)
{
case -1:parent->left = NULL; break;
case 1:parent->right = NULL; break;
case 0:parent = NULL; break;
}

free(point);
return T;
}

if (point->left == NULL&&point->right != NULL)
{
if (postion == -1)
parent->left = point->right;
else
if (postion == 1)
parent->right = point->right;
else
root = root->right;

free(point);
return T;
}

if (point->left != NULL&&point->right == NULL)
{
if (postion == -1)
parent->left = point->left;
else
if (postion == 1)
parent->right = point->left;
else
root = root->left;
return T;
}

if (point->left != NULL&& point->right != NULL)
{
parent = point;
child = point->left;
while (child->right != NULL)
{
parent = child;
child = child->right;
}
point->L = child->L;
if (parent->left = child)
parent->left = child->left;
else
parent->right = child->left;

free(child);

return T;
}
}

}
Leveltree*  deletetree(Leveltree*  root )
{
string node; int socres;
cout << "请输入要删除的学号和对应积分:" << endl;
cin >> node>>socres;
Leveltree*  parent;
Leveltree*  point=new Leveltree;
Leveltree*  child;
int postion;
parent = binary_search(root, node,socres, &postion);
//二叉树为空的情况
if (parent == NULL)
return root;
else
{
switch (postion)
{
case -1:point = parent->left; break;

case 1:point = parent->right; break;

case  0:point = parent; break;
}

if (point->left == NULL&&point->right == NULL)
{
switch (postion)
{
case -1:parent->left = NULL; break;
case 1:parent->right = NULL; break;
case 0:parent = NULL; break;
}

free(point);
return root;
}

if (point->left == NULL&&point->right != NULL)
{
if (postion == -1)
parent->left = point->right;
else
if (postion == 1)
parent->right = point->right;
else
root = root->right;

free(point);
return root;
}

if (point->left != NULL&&point->right == NULL)
{
if (postion == -1)
parent->left = point->left;
else
if (postion == 1)
parent->right = point->left;
else
root = root->left;
return root;
}

if (point->left != NULL&& point->right != NULL)
{
parent = point;
child = point->left;
while (child->right != NULL)
{
parent = child;
child = child->right;
}
point->L = child->L;
if (parent->left = child)
parent->left = child->left;
else
parent->right = child->left;

free(child);
return root;
}
}

}
static void inorder( Leveltree*b)//中序遍历
{

if (b != NULL)
{
inorder(b->left);
b->L.show();//cout<<b->L.name<<" ";
inorder(b->right);
}
}
static void rinorder( Leveltree*b)//中序遍历,先遍历右子树
{

if (b != NULL)
{
rinorder(b->right);
b->L.show();//cout << b->L.name << " ";
rinorder(b->left);
}
}

};

class Member
{
public:
Member(string Name = "null", string Post = "null", string Tele = "null", Member* pPrev = NULL, Member* pNext = NULL) :M_sName(Name), M_sPost(Post), M_sTele(Tele), m_pPrev(pPrev), m_pNext(pNext) {}
Member(Member* pPrev = NULL, Member* pNext = NULL)
{
m_pPrev = pPrev; m_pNext = pNext;
M_sName = "null";
M_sPost = "null";
M_sTele = "null";
M_sNo = "null";
M_sSex = "null";;
M_sClass = "null";
M_sTime = "null";
}
void show()
{
cout << "学号:" << M_sNo << "  " << "姓名:" << M_sName << "  " << "性别:" <<M_sSex << "  " << "班级:" << M_sClass << "  " << "职务:" <<M_sPost << "  " << "入社时间:" << M_sTime << "  " << "手机:" << M_sTele << endl;
}

Member(int) {}
Member() {}
string M_sNo;
string M_sName;
string M_sSex;
string M_sClass;
string M_sTime;
string M_sPost;
string M_sTele;	//数据
Member* m_pPrev;	//前指针
Member* m_pNext;	//后指针
void Setmebmer()
{
cout << "********请输入学号,姓名,性别,班级,入团时间,联系方式:***********"<<endl;
cin >> M_sNo >> M_sName >> M_sSex >> M_sClass >> M_sTime  >> M_sTele;
}
void SetPost(string post)
{
M_sPost = post;
}
void swap(Member *p, Member *t)  //p,t结点有序,p为前结点,t为后结点
{
cout << "come in swap" << endl;
Member *temp;
if (t->m_pNext == NULL) //t结点是否为尾结点
{
if (p->m_pNext == t) //p,t结点是否相邻
{
//与尾结点相邻的交换代
t->m_pNext = p;
t->m_pPrev = p->m_pNext;
p->m_pNext = NULL;
p->m_pPrev->m_pNext = t;
p->m_pPrev = t;
}
else
{
//与尾结点不相邻的交换代
t->m_pNext = p->m_pNext;
t->m_pPrev->m_pNext = p;
temp = t->m_pPrev;
t->m_pPrev = p->m_pPrev;
p->m_pNext->m_pPrev = t;
p->m_pNext = NULL;
p->m_pPrev->m_pNext = t;
p->m_pPrev = temp;
}
}
else
{
if (p->m_pNext == t) //p,t结点是否相邻
{
//相邻的交换代
t->m_pNext->m_pPrev = p;
temp = t->m_pNext;
t->m_pNext = p;
t->m_pPrev = p->m_pPrev;
p->m_pNext = temp;
p->m_pPrev->m_pNext = t;
p->m_pPrev = t;
}
else
{
//不相邻的交换代
t->m_pNext->m_pPrev = p;
temp = t->m_pNext;
t->m_pNext = p->m_pNext;
p->m_pNext->m_pPrev = t;
p->m_pNext = temp;
t->m_pPrev->m_pNext = p;
temp = t->m_pPrev;
t->m_pPrev = p->m_pPrev;
p->m_pPrev->m_pNext = t;
p->m_pPrev = temp;
}
}
}
void Sort(Member *H)  //选择排序算法
{
//cout << "come in" << endl;
Member *i, *j, *k;
if (!H->m_pNext)  //双向链表为空则返回
return;
for (i = H->m_pNext; i->m_pNext != NULL; i = k->m_pNext)
{
for (j = i->m_pNext, k = i; j != NULL; j = j->m_pNext)
if (k->M_sName > j->M_sName)
k = j;
if (k != i)
swap(i, k);
}
}
};
Member* m_pHead;	//头节点
Member* m_pTail;	//尾节点
Leveltree *Root;   //等级管理
AList Alist;//活动列表
SList Slist;//赞助商列表
PList Plist;//评价列表
};

/*顺序栈的定义*/
#define Stack_Size 100
typedef struct sqStack
{
int *elem;
int top;
int stackSize;//栈数组长度
}sqStack;

/*顺序栈的初始化*/
void initStack_Sq(sqStack &S)
{
S.elem = new int[Stack_Size];
S.top = -1;
S.stackSize = Stack_Size;
}
/*入栈*/
void push(sqStack &S, int x)
{
if (S.top == Stack_Size - 1)
cout << "Stack Overflow!";
S.elem[++S.top] = x;
}

/*出栈*/
int pop(sqStack &S)
{
int x;
if (S.top == -1)
cout << "Stack Empty!";
x = S.elem[S.top--];
return x;
}
typedef struct EdgeNode
{//边表结点的定义
int adjvex;//存放邻接点在顶点表中的位置
struct EdgeNode * nextedge;//指向下一个边表结点
}EdgeNode;
typedef struct VexNode
{//顶点表结点的定义
string vex;//存放顶点信息
int sure;
EdgeNode * firstedge;//指向第一个边表结点
int indegree;
}VexNode;
typedef struct
{//顶点表的定义
VexNode vexs[MAX_VERTEX_NUM];
int vexnum, edgenum;
}LGraph;
/*构造有向图的邻接表*/
void CreateDG_AL(LGraph &G)
{

char* FileName;
FileName = "in.txt";
ifstream Fin;
Fin.open(FileName, ios::in);
int i, j, k;
int n, e;
//cout << "请输入节点数和边数:" << endl;
Fin >> n >> e;
G.vexnum = n;
G.edgenum = e;
for (i = 0; i<n; i++)
{
//cout << "输入结点信息:" << endl;
Fin >> G.vexs[i].vex >> G.vexs[i].sure;
G.vexs[i].firstedge = NULL;//初始化为空
}
for (k = 0; k<e; k++)
{
EdgeNode *p;
//cout << "输入相邻结点i,j" << endl;
Fin >> i >> j;
p = new EdgeNode;
p->adjvex = j;
p->nextedge = G.vexs[i].firstedge;
G.vexs[i].firstedge = p;//采用头插法
}
Fin.close();
}
//拓扑排序
bool TopoSort(LGraph &G)
{
sqStack S;
initStack_Sq(S);
EdgeNode *p;
int count = 0;
int i, j;
for (i = 0; i<G.vexnum; i++)
G.vexs[i].indegree = 0;//初始化为0
for (i = 0; i<G.vexnum; i++)
{//计算各个顶点的入度
p = G.vexs[i].firstedge;
while (p)
{
G.vexs[p->adjvex].indegree++;
p = p->nextedge;
}
}
for (i = 0; i < G.vexnum; i++)
if (G.vexs[i].indegree == 0)
if (G.vexs[i].sure == 1)
push(S, i);//将度为0的顶点入栈
else
{
cout << "请先完成" << G.vexs[i].vex << endl;
return false;
}
while (S.top != -1)
{
j = pop(S);
//if(G.vexs[j].sure==1)
cout << G.vexs[j].vex << "->";//将栈顶的元素出栈且输出
count++;//计数器加1
p = G.vexs[j].firstedge;//让p指向入度为0的顶点的第一个边表结点
while (p)
{
G.vexs[p->adjvex].indegree--;//将入度为0的顶点的邻接点的入度减1
if (G.vexs[p->adjvex].indegree == 0)
if (G.vexs[p->adjvex].sure == 1)
push(S, p->adjvex);
else
{
cout << G.vexs[p->adjvex - 1].vex << "已经完成!" << endl;
cout << "请再完成" << G.vexs[p->adjvex].vex << endl;
return false;
}
p = p->nextedge;
}
}
return true;
if (count<G.vexnum)
cout << "有回路!" << endl;
return false;
}

class Shetuan
{
private:
string ShetuanName;
string Shetuankouhao;
string Shetuanzongzhi;
string Shetuanzhangcheng;
string Shetuanfaqiren;
string Shetuanxinzhi;
public:
Shetuan()
{
ShetuanName = "霸王社团";
Shetuankouhao = "信霸王,得永生!";
Shetuanzhangcheng = "1.服从上级指挥!\n          2.认真完成工作!";
Shetuanzongzhi = "一切为了同学!";
Shetuanxinzhi = "学生会";
Shetuanfaqiren = "周恬";
}
void Set()
{
cout << "社团名称:" << endl;
cin >> ShetuanName;
cout << "社团口号:" << endl;
cin >> Shetuankouhao;
cout << "社团宗旨:" << endl;
cin >> Shetuanzongzhi;
cout << "社团章程:" << endl;
cin >> Shetuanzhangcheng;
cout << "社团发起人:" << endl;
cin >> Shetuanfaqiren;
cout << "社团性质:" << endl;
cin >> Shetuanxinzhi;
}
void show()
{
cout << "社团名称:" << ShetuanName << endl;
cout << "社团口号:" << Shetuankouhao << endl;
cout << "社团宗旨:" << Shetuanzongzhi << endl;
cout << "社团章程:" << Shetuanzhangcheng << endl;
cout << "社团发起人:" << Shetuanfaqiren << endl;
cout << "社团性质:" << Shetuanxinzhi << endl;
}
};
void munemain()
{
cout << "****************************************1.成员信息管理***************************************" << endl;
//cout << "********************2.社团助手************************" << endl;
//cout << "********************3.社团活动管理********************" << endl;
}
void mune1()
{
cout << "*****************************************1.通讯录管理*****************************************" << endl;
//cout << "********************2.成员等级管理********************" << endl;
}
void mune2()
{
cout << "*****************************************4.社团基本信息管理***********************************" << endl;
cout << "*****************************************5.组织机构管理***************************************" << endl;
cout << "*****************************************6.赞助商管理*****************************************" << endl;
}
void mune3()
{
cout << "*****************************************7.活动计划管理***************************************" << endl;
//cout << "********************11.活动筹备管理********************" << endl;
cout << "*****************************************8.活动评价管理***************************************" << endl;
}
void mune4()
{
cout << "*****************************************1.添加联系人******************************************" << endl;
cout << "*****************************************2.查找联系人******************************************" << endl;
cout << "*****************************************3.删除联系人******************************************" << endl;
cout << "*****************************************4.查看通讯录******************************************" << endl;

}
void mune5()
{
cout << "*****************************************2.查看成员信息***************************************" << endl;
cout << "*****************************************3.删除成员*******************************************" << endl;
}
void mune6()
{
cout << "*****************************************9.活动计划分析***************************************" << endl;
cout << "****************************************10.活动经费*******************************************" << endl;
cout << "****************************************11.校园导航*******************************************" << endl;
}

bool Huodonfenxi(ListMembers &S,LGraph &G)
{
int i = 1;

if (TopoSort(G))
{
cout << "活动已经完美进行!!!!" << endl; return true;
}
else
{
while (i != 0)
{
cout << "1.拉赞助" << endl;
cout << "2.采购" << endl;
cout << "3.布置" << endl;
cout << "4.报名" << endl;
cout << "5.开始进行活动" << endl;
cin >> i; Sleep(1000); system("cls");
switch (i)
{
case 1:if (S.GiveMoney()) { G.vexs[0].sure = 1; cout << "已经拉到赞助!" << endl; }Sleep(1000); system("cls"); break;
case 2:if (G.vexs[0].sure == 1)
{
G.vexs[1].sure = 1;
cout << "采购完成!" << endl; Sleep(1000); system("cls");
}
else
{
cout << "没有钱!" << endl; Sleep(1000); system("cls");
}break;
case 3:if (G.vexs[1].sure == 1)
{
G.vexs[2].sure = 1; cout << "完成布置!" << endl; Sleep(1000); system("cls");
}
else {
cout << "没有东西可以布置,还没有采购" << endl; Sleep(1000); system("cls");
} break;
case 4:if (G.vexs[2].sure == 1) { G.vexs[3].sure = 1; cout << "完成报名!" << endl; }
else {
cout << "东西还没有布置好,先去布置!" << endl; Sleep(1000); system("cls");
} break;
case 5:if (G.vexs[3].sure == 1) { G.vexs[4].sure = 1; cout << "活动可以开始进行!" << endl; }
else {
cout << "没有人报名,活动无法进行!" << endl; Sleep(1000); system("cls");
} break;
default:break;
}
}
}
return false;
}
void jihuaguanli(ListMembers &S)
{
int i = 1;
while (i != 0)
{
cout << "1.添加活动" << endl;
cout << "2.删除活动" << endl;
cout << "3.显示活动" << endl;
cout << "4.报名参加" << endl;
cin >> i; Sleep(1000); system("cls");
switch (i)
{
case 1:S.AddActivity(); break;
case 2:S.DeleteActivity(); break;
case 3:S.showActivity(); break;
case 4:S.Baoming(); break;

default:break;
}
}
}
void pinhjiaguanli(ListMembers &S,LGraph &G,bool y)
{
if (y)
{
int i = 1;
while (i != 0)
{
cout << "1.添加评价" << endl;
cout << "2.显示评价" << endl;
cout << "3.清空评价" << endl;
cin>> i; Sleep(1000); system("cls");
switch (i)
{
case 1:S.AddPinjia(); break;
case 2:S.showPinjia(); break;
case 3:S.CleerPingjia(); break;
default:break;
}
}
S.AddPinjia();
S.showPinjia();

}
else
{
cout << "活动并未成功举办,不能评价!" << endl; Sleep(1000); system("cls");
}
}

void stjibxinxi(Shetuan &S)
{

S.show();
int i = 1;
cout << "1.更改社团信息;0.返回" << endl;
cin >> i; Sleep(1000); system("cls");
if (i == 1)
{
S.Set();
}
}
void zuzhijigou()
{
cout << " 正在与学习进行激烈的洽谈,敬请期待!" << endl; Sleep(1000); system("cls");
}
void zanzhushang(ListMembers &S)
{
int i = 1;
while (i != 0)
{
cout << "1.添加赞助商" << endl;
cout << "2.删除赞助商" << endl;
cout << "3.显示赞助商" << endl;
cin >> i; Sleep(1000); system("cls");
switch (i)
{
case 1:S.AddSponser(); break;
case 2:S.DeleteSponser(); break;
case 3:S.showSponser(); break;
default:break;
}
}

}
void shetuanzhushou(Shetuan &S)
{
int l = 1;
while (l != 0)
{
mune2();
cin >> l;
switch (l)
{
case 1:stjibxinxi(S); break;
case 2:zuzhijigou(); break;
//case 3:zanzhushang(); break;
default:break;
}
}
}
void dengji(ListMembers &List)
{
int k = 1;
while (k!= 0)
{
mune5();
cin >> k;system("cls");
switch (k)
{
case 1:List.TravelTree(); break;
case 2:List.DeleteTree(); break;
default:break;
}
}
}
void tongxun(ListMembers &List)
{
int j = 1;
while (j != 0)
{
mune4();
cin >> j;system("cls");
switch (j)
{
case 1:List.Addend(); break;
case 2:List.Search(); break;
case 3:List.Delete(); break;
case 4:List.Travel(); break;
default:break;
}
}
}
void xinxiguanli(ListMembers &List)
{
int i = 1;
while (i != 0)
{
mune1();
cin >> i; system("cls");
switch (i)
{
case 1:tongxun(List); break;
case 2:dengji(List); break;
default:break;
}
}
}
int main()
{
bool Y = false;
LGraph G;
CreateDG_AL(G);
Shetuan S;
Map M;
ListMembers List;
int n=1;
while (n != 0)
{
mune1();

mune5();
mune2();
mune3();
mune6();
cin >> n; system("cls");
switch (n)
{
case 1:tongxun(List);/*xinxiguanli(List);*/ break;
//case 2:List.Search();/*shetuanzhushou(); */break;
//case 3:List.Delete();/*shetuanhuodon();*/ break;
//case 4:List.Travel(); break;
//case 2:dengji(List); break;
case 2:List.TravelTree(); break;
case 3:List.DeleteTree(); break;
case 4:stjibxinxi(S); break;
case 5:zuzhijigou(); break;
case 6:zanzhushang(List); break;
case 7:jihuaguanli(List); break;
//case 11:choubeiguanli(); break;
case 8:pinhjiaguanli(List,G,Y); break;
case 9:Y=Huodonfenxi(List,G); break;
case 10:cout << "当前共有活动经费:" << List.GetMoney() << "元" << endl; cout << "是否进行拉赞助?1/0" << endl; int i; cin >> i; Sleep(1000); system("cls"); if(i!=0)zanzhushang(List); break;
case 11: M.Findway(); break;
default:break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息