题目描述
假设某校有20间宿舍,宿舍编号101,102,…,120。每间只住一名学生。初始部分宿舍已用。
用两个链表(已用宿舍链表和可用宿舍链表)维护宿舍的管理,实现宿舍分配、宿舍交回。约定已用宿舍链表按宿舍号升序链接。初始可用宿舍链表也按宿舍号升序链接。
宿舍分配从可用宿舍链表中摘取第一间宿舍分配给学生。学生交回的宿舍挂在可用宿舍链表最后。
备注:使用单链表或者静态链表。不用考虑宿舍分配和交回不成功的情况。
输入
初始宿舍状态,第一行输入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>
#include <cstring>
using namespace std;
#define ok 0
class ListNode {
public:
int data; //房间号
string name; //住户名
ListNode *next;
ListNode() {
next = NULL;
}
};
class LinkList {
public:
ListNode *head;
int len;
LinkList() {
head = new ListNode;
len = 0;
}
~LinkList() {
ListNode *p,*q;
p=head;
while(p != NULL) {
q = p;
p = p->next;
delete q;
}
len = 0;
head = NULL;
}
ListNode * LL_index(int i) { //返回第i个链表的结点
ListNode *p = head;
for(int j = 1; j <= i; j++ ) {
p = p->next;
}
return p;
}
ListNode push_back(int num,string na = "无") { //放到链表尾
ListNode *p = new ListNode;
ListNode *q = LL_index(len);
p->data = num;
p->name = na;
q->next = p;
len++;
return *p;
}
int LL_get(int i) { //获取房间号
if(i > 0 && i <= len) {
ListNode *p = LL_index(i);
return p->data;
} else {
return -1;
}
}
int LL_insert(int i, string na, int item) {
if(i > 0 && i <= len + 1) {
ListNode *p = LL_index(i-1);
ListNode *temp;
temp = p->next;
ListNode *q = new ListNode;
q->data = item;
q->name = na;
p->next = q;
q->next = temp;
len++;
} else
cout<<"error"<<endl;
}
int LL_del(int i) { //删除第i个结点
if(i > 0 && i <= len) {
ListNode *p = LL_index(i-1);
ListNode *temp = p->next;
p->next = p->next->next;
len--;
temp->next=NULL;
delete temp;
} else
cout<<"error"<<endl;
}
void display_free() {
ListNode *p;
p = head->next;
while(p) {
cout<< p->data;
if(p->next != NULL){
cout<<"-";
}
p = p->next;
}
cout<<endl;
}
void display_used() {
ListNode *p;
p = head->next;
while(p) {
cout<<p->name<<"("<< p->data <<")";
if(p->next != NULL) {
cout<<"-";
}
p = p->next;
}
cout<<endl;
}
};
int main() {
int n, room;
string name,order;
LinkList free;
for(int i = 101; i <= 120; i++) { //创建101~120房间号的空房间链表
free.push_back(i,"1");
}
LinkList used;
cin>>n;
while(n--) {
cin>>name>>room;
used.push_back(room, name); //把房间号和住户名传入已用房间链表
for(int i = 1; i <=free.len; i++) {
if(free.LL_get(i) == room) { //在对应的空房间链表找到对应的房间号并删除
free.LL_del(i);
break;
}
}
}
cin>>n;
while(n--) {
cin>>order;
if(order == "assign") {
cin>>name;
room=free.LL_get(1); //获得第一个房间号安排给新住户
free.LL_del(1); // 删除第一个空房间
for(int i = 1; i <= used.len; i++) {
if(used.LL_get(i) > room) { //按房间号顺序插入新住户
used.LL_insert(i, name, room);
break;
}
}
}
if(order == "return") {
cin>>room;
for(int i = 1; i <= used.len; i++) {
if(used.LL_get(i) == room) { //删除要退房的住户
used.LL_del(i);
}
}
free.push_back(room); //空房间放回空房间链表
}
if(order == "display_used") {
used.display_used();
}
if(order == "display_free") {
free.display_free();
}
}
}
我的错误
创建指针需要new空间才能放东西,如下图的错误
没有内存存放数据报错