题目:
问题 E: DS链表—学生宿舍管理
时间限制: 1 Sec 内存限制: 128 MB
提交: 322 解决: 190
[提交][状态][讨论版]
题目描述
假设某校有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
代码块:
#include <iostream>
using namespace std;
class ListNode
{
public:
char people[20];
int data;
ListNode *next;
ListNode(){next = NULL;}
};
class LinkList
{
public:
int len;
ListNode *head;
LinkList();
~LinkList()
{
ListNode *p = head;
ListNode *q;
while(p)
{
q = p->next;
delete p;
p = q;
}
len = 0;
head = NULL;
}
};
LinkList::LinkList()
{
len = 0;
head = new ListNode;
}
int main(void)
{
LinkList L1, L2;
ListNode *q1 = L1.head;
ListNode *q2 = L2.head;
int n1, n2;
cin>>n1;
int i, j;
for(i=0; i<n1; i++)
{
ListNode *p = new ListNode;
cin>>p->people>>p->data;
q1->next = p;
q1 = q1->next;
}
ListNode *r;
for(i=101; i<121; i++)
{
int x = 0;
r = L1.head;
for(j=0; j<n1; j++)
{
r = r->next;
if(r->data==i)
{
x = 1;
break;
}
}
if(0==x)
{
ListNode *t = new ListNode;
t->data = i;
q2->next = t;
q2 = q2->next;
}
}
string a;
cin>>n2;
while(n2--)
{
cin>>a;
if("assign"==a)
{
q2 = L2.head;
ListNode *p2 = q2->next;
q2->next = p2->next;
cin>>p2->people;
q1 = L1.head;
while(q1)
{
if((q1->data<p2->data||q1==L1.head)&&(q1->next->data>p2->data||q1->next==NULL))
{
p2->next = q1->next;
q1->next = p2;
break;
}
else
q1 = q1->next;
}
}
else if("return"==a)
{
int temp;
cin>>temp;
q1 = L1.head;
while(q1)
{
q2 = q1->next;
if(q2->data==temp)
{
q1->next = q2->next;
ListNode *p1 = L2.head;
while(p1->next)
p1 = p1->next;
p1->next = q2;
q2->next = NULL;
break;
}
else
q1 = q1->next;
}
}
else if("display_free"==a)
{
ListNode *p1 = L2.head->next;
while(p1)
{
cout<<p1->data;
if(p1->next)
cout<<'-';
p1 = p1->next;
}
cout<<endl;
}
else if("display_used"==a)
{
ListNode *p1 = L1.head->next;
while(p1)
{
cout<<p1->people<<'('<<p1->data<<')';
if(p1->next)
cout<<'-';
p1 = p1->next;
}
cout<<endl;
}
}
return 0;
}
题解:
- 这里ListNode类里不用申明析构函数,因为在LinkList类中的析构函数已经对所有节点进行了删除。