PTA 单链表(流浪狗收养所)

单链表(流浪狗收养所)

怡山小学生物组的同学在课外要收养一批流浪狗。在流浪狗进入收养基地时,课外指导老师会给每一只狗取一个唯一的编号,并且判定它的年龄,让组长输入流浪狗档案。档案以单链表存储,按年龄为序(从小到大),如果年龄相同,则后录入的记录应该放在前面。

由于组里新来了一位二年级的淘气组员小林,喜欢将已经输入的档案再次输入。他在输入时,会输入正确的编号,却可能输入错误的年龄(但他所输入的年龄不会大于真实的年龄),因此在输入档案外,组长还需要对档案进行清理,清除那些重复档案。

输入时:首先输入任务类型: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值