DS链表—学生宿舍管理(静态链表)

题目描述

假设某校有20间宿舍,宿舍编号101,102,...,120。每间只住一名学生。初始部分宿舍已用。用两个链表(已用宿舍链表和可用宿舍链表)维护宿舍的管理,实现宿舍分配、宿舍交回。

约定已用宿舍链表按宿舍号升序链接。初始可用宿舍链表也按宿舍号升序链接。

宿舍分配从可用宿舍链表中摘取第一间宿舍分配给学生。学生交回的宿舍挂在可用宿舍链表最后。

备注:使用list容器或静态链表。不用考虑宿舍分配和交回不成功的情况。

输入

初始宿舍状态,第一行输入n,表示已用宿舍n间

后跟n行数据,每行格式为:宿舍号 学生姓名

操作次数m,后跟m行操作,操作格式如下:

assign 学生  //为学生分配宿舍,从可用宿舍链表头摘取一间宿舍,

                    //按宿舍号升序挂在已用宿舍链表中。

return  宿舍号   //学生退宿舍,删除已用宿舍链表中对应结点,

                         //挂在可用宿舍链表尾部。

display_free   //输出可用宿舍链表信息。

display_used   //输出已用宿舍链表信息。

输出

 display_free依次输出当前可用宿舍链表中的宿舍号,具体格式见样例。

 display_used依次输出当前已用宿舍链表中的学生和宿舍号,具体格式见样例。

 输入样例

5
李明  103
张三  106
王五  107
钱伟  112
章立  118
8
assign 李四
assign 赵六
return 118
return 101
assign 马山
display_used
assign 林立
display_free

输出样例

赵六(102)-李明(103)-马山(104)-张三(106)-王五(107)-钱伟(112)
108-109-110-111-113-114-115-116-117-119-120-118-101 

list是一种序列式容器, list实际上就构成了一个双向循环链,

List类使用的参考代码

包含头文件  :  #include

List定义和初始化:

    listlst1;          //创建空list

    list lst2(5);       //创建含有5个元素的list

    listlst3(3,2);  //创建含有3个元素的list

    listlst4(lst2);    //使用lst2初始化lst4

    listlst5(lst2.begin(),lst2.end());  //同lst4

创建一个list对象l(注意list是模板类):list  l; //堆栈的数据类型是字符型

把一个字符ct添加到链表末尾: s.push_back(ct);

把一个字符ct插入到链表头部: s.push_front(ct);

获取链表第一个元素和最后一个元素:front()和back(),获取链表第一个元素,放入变量c2: c2 = s.front();

删除链表第一个元素和最后一个元素pop_front()和pop_back();

判断 判断list是否为空:empty(): l.empty(),如果为空则函数返回true,如果不空则返回false

begin() 返回指向第一个元素的迭代器 

end() 返回末尾的迭代器

rbegin() 返回指向第一个元素的逆向迭代器 

rend() 指向list末尾的逆向迭代器

程序示列:

#include  

using namespace std;

typedef list LISTINT; 

    

 void main() 

 { 

   //用LISTINT创建一个list对象 

   LISTINT listOne; 

   //声明i为迭代器 

   LISTINT::iterator i; 

    

   listOne.push_front(3); 

   listOne.push_front(2); 

   listOne.push_front(1); 

    

   listOne.push_back(4); 

   listOne.push_back(5); 

   listOne.push_back(6); 

    

   cout << "listOne.begin()--- listOne.end():" << endl; 

   for (i = listOne.begin(); i != listOne.end(); ++i) 

     cout << *i << " "; 

   cout << endl;    //正向输出

    

   LISTINT::reverse_iterator ir; 

   cout << "listOne.rbegin()---listOne.rend():" << endl; 

   for (ir = listOne.rbegin(); ir != listOne.rend(); ir++) { 

     cout << *ir << " "; 

   }   

   cout << endl;    //反向输出

}

 

 

#include
#include  
using namespace std;
//typedef list ENABLE;
//typedef listDISTRI;
#define MAXSIZE 30
typedef struct {
	string name;
	int room;
	int cur;
} component, SLinkList[MAXSIZE];

void InitSpace_SL(SLinkList& enable,SLinkList&distri) {
	for (int i = 0; i < MAXSIZE - 1; ++i){
		enable[i].cur = i + 1;
		enable[i].room = 0;
	}
	enable[MAXSIZE - 1].cur = 0;
	for (int i = 0; i < MAXSIZE - 1; ++i) { 
		distri[i].cur = i + 1; 
		distri[i+1].room = 100+ i +1;
		enable[i].room = 0;
	}
	distri[MAXSIZE - 1].cur = 0;
	
} 

void InSpace_SL(SLinkList& enable, SLinkList& distri,int n) {
	for (int i = 1; i <= n; i++) {
		cin >> enable[i].name >> enable[i].room;
		int room = enable[i].room;
		int j = distri[0].cur;
		int j1 = 0;
		for (int i = 1; i <= 20; i++) {
			if (distri[j].room == room) {
				distri[j1].cur = distri[j].cur;
				break;
			}
			j1 = j;
			j = distri[j].cur;
		}//删除已分配的房间
	}
}

void Assign(SLinkList& enable, SLinkList& distri, string name,int n) {
	//n是总人数  6	外边要+1
	int j2 = distri[0].cur;
	enable[n].name = name;
	enable[n].room = distri[j2].room;
	distri[0].cur = distri[j2].cur;
	int j= enable[0].cur;
	int j1=0;//保留上一个的cur
	for (int i = 1; i < n; i++) {
		if (enable[n].room < enable[j].room) {
			enable[j1].cur = n ;//上一个的cur等于他的n
			enable[n].cur = j;
			break;
		}//按大小插入在enable链表中
		j1 = j;
		j = enable[j].cur;
	}
}

void Return(SLinkList& enable, SLinkList& distri, int room,int n,int i1) {//i1是return的个数
	int j = enable[0].cur;
	int j1 = 0;//保留上一个的cur
	for (int i = 1; i <= n; i++) {
		if (room == enable[j].room) {
			enable[j1].cur = enable[j].cur;
			break;
		}//更新enable链表
		j1 = j;
		j = enable[j].cur;
	}
	int n1 = 20 + i1;
	distri[n1].room = room;
	
}

void display_free(SLinkList&enable,int n) {
	int j = enable[0].cur;
	for (int i = 1; i <= n; i++) {
		cout << enable[j].name << "(" << enable[j].room << ")";
		j = enable[j].cur;
		if (i != n){ cout << "-"; }
	}
	cout << endl;
}

void display_used(SLinkList& distri, int n) {
	int j = distri[0].cur;
	for (int i = 1; i <= n-2; i++) {
		cout << distri[j].room ;
		j = distri[j].cur;
		if (i != n - 2) { cout << "-"; }
	}
	cout << endl;
}

int main() {
	int n; cin >> n;
	SLinkList Enable, Distri;
	InitSpace_SL(Enable, Distri);
	InSpace_SL(Enable, Distri, n);
	string oper, name; int room;
	int t; cin >> t;
	int i1 = 0,i2=1;
	while(t--){
		cin >> oper;
	if (oper == "assign") { 
		n++;
		 cin >> name;
		Assign(Enable, Distri, name,n); }
	if (oper == "return") {
		cin >> room;
		++i1;
		Return(Enable, Distri, room, n,i1);
		n--;
	}
	if (oper == "display_used") {
		display_free(Enable, n);
	}
	if (oper == "display_free") {
		int nn = 20 - n + i1;
		display_used(Distri, nn);
	}
}
}

你可能感兴趣的:(数据结构,链表)