单链表(流浪狗收养所)
怡山小学生物组的同学在课外要收养一批流浪狗。在流浪狗进入收养基地时,课外指导老师会给每一只狗取一个唯一的编号,并且判定它的年龄,让组长输入流浪狗档案。档案以单链表存储,按年龄为序(从小到大),如果年龄相同,则后录入的记录应该放在前面。
由于组里新来了一位二年级的淘气组员小林,喜欢将已经输入的档案再次输入。他在输入时,会输入正确的编号,却可能输入错误的年龄(但他所输入的年龄不会大于真实的年龄),因此在输入档案外,组长还需要对档案进行清理,清除那些重复档案。
输入时:首先输入任务类型:1代表插入新的记录, 2代表清理档案, 0代表退出。如果需要加入新的记录,则接下来将依次输入编号和年龄。
输出时:按照从前到后的顺序输出档案中的所有的记录,每条记录单独占一行。
函数接口定义:
Dog *insert(string &no, int age); //加入一只狗的信息
Dog *clear(); //清理档案
裁判测试程序样例:
#include <iostream>
#include <string>
using namespace std;
struct Dog{
string no;
int age;
Dog *next;
};
Dog *head=NULL;
void *del(Dog *p){
if(p!=NULL) {
del(p->next);
delete p;
}
}
void display(Dog *p){
if(p!=NULL){
cout<<p->no<<' '<<p->age<<endl;
display(p->next);
}
}
Dog *clear();
Dog *insert(string &no, int age);
int main()
{
int task, age;
string no;
cin>>task;
while(task>0){
switch(task){
case 1:cin>>no>>age; head=insert(no, age); display(head); break;
case 2:head=clear(); display(head); break;
}
cin>>task;
}
del(head);
return 0;
}
/* 请在这里填写答案 */
输入样例:
1 abcd 2
1 cd 5
1 cd 4
1 zz 4
2
0
输出样例:
abcd 2
abcd 2
cd 5
abcd 2
cd 4
cd 5
abcd 2
zz 4
cd 4
cd 5
abcd 2
zz 4
cd 5
AC代码:
Dog* clear()
{
if(head==NULL) return head;
Dog* cur = head,*p=head->next,*r=NULL;
while (p != NULL) {
Dog* travel = p;
while (travel != NULL && cur->no != travel->no)
travel = travel->next;
if (travel != NULL) {
if (cur == head) {
delete(head);
head = p;
cur = head;
p = p->next;
}
else {
r->next = p;
delete(cur);
cur = p;
p = p->next;
}
}
else {
r = cur;
cur = cur->next;
p = cur->next;
}
}
return head;
}
Dog* insert(string& no, int age)
{
Dog* newdog = new Dog;
newdog->no = no;
newdog->age = age;
newdog->next = NULL;
if (head == NULL) return newdog;
Dog* cur = head,*p=NULL;
while (cur != NULL && cur->age < newdog->age) {
p = cur;
cur = cur->next;
}
if (cur == head) {
newdog->next = cur;
return newdog;
}
newdog->next = cur;
p->next = newdog;
return head;
}