南邮 OJ 1014 数据的插入与删除

数据的插入与删除

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 1946            测试通过 : 405 

比赛描述

在一组数据(数目不超过10000)中,插入新数,删除所有与给定数相等的数据。



输入

第一行是未排序的一组非负整数,数目不超过10000。以-1作为结束标志。

第二行是要插入的数。

第三行是要删除的数。

输出

第一行输出自小到大排好序的数。如果没有元素,输出“No elements.”(不包括引号)。

第二行输出插入后自小到大排好序的数,以“,”隔开。

第三行输出删除后自小到大排好序的数,以“,”隔开。如果没有元素,输出“No elements.”(不包括引号)。

样例输入

100 98 79 63 44 99 -1
88
79

样例输出

44,63,79,98,99,100
44,63,79,88,98,99,100
44,63,88,98,99,100

提示

 

题目来源

GUOJ


#include<iostream>
using namespace std;

template<typename Type>
class SinglyLinkedNode{
	Type data;
	SinglyLinkedNode *next;
public:
	void createLink(void);
	void printLink(void);
	void reverseLink(void);
	void deleteElements(Type del);
	void addNodeToOrderedLink(Type add);
};

/*
*函数说明:输入一个链表,第一行给出元素数目n(0<n≤1000),第二行给出元素数值
*入口参数:无
*出口参数:无
*作者:陈汝军
*日期:2014-8-17 21:42:44
*/
template<typename Type>
void SinglyLinkedNode<Type>::createLink(void){
	int n;						//元素数目
	cin>>n;
	SinglyLinkedNode *p,*q;
	p = this;
	while(n--){
		q = new SinglyLinkedNode();
		cin>>q->data;
		p->next = q;
		p = q;
	}
}

/*
*函数说明:打印一个链表
*入口参数:无
*出口参数:无
*作者:陈汝军
*日期:2014-8-17 21:42:51
*/
template<typename Type>
void SinglyLinkedNode<Type>::printLink(void){
	SinglyLinkedNode *p = this->next;
	if(p==NULL){
		cout<<"No elements.";
	}
	while(p!=NULL){
		cout<<p->data;
		p = p->next;
		if(p!=NULL)
			cout<<",";
	}
	cout<<endl;
}

/*
*函数说明:翻转一个链表
*入口参数:无
*出口参数:无
*作者:陈汝军
*日期:2014-8-17 21:42:28
*/
template<typename Type>
void SinglyLinkedNode<Type>::reverseLink(void){
	SinglyLinkedNode *p,*q;
	p = this->next;								//p指向原来链表第一个元素,也是翻转后的最后一个元素的下一个元素
	if(p == NULL) return;
	q = p->next;								//q指向将要移动的元素
	while(q!=NULL){		
		p->next = q->next;
		q->next = this->next;
		this->next = q;
		q = p->next;
	}
}

/*
*函数说明:删除一个链表与给出的值相等的节点
*入口参数:Type del:将要删除的值
*出口参数:无
*作者:陈汝军
*日期:2014-8-17 21:43:38
*/
template<typename Type>
void SinglyLinkedNode<Type>::deleteElements(Type del){
	SinglyLinkedNode *p,*q;
	p = this;
	q = p->next;
	while(q!=NULL){
		if(q->data == del){
			p->next = q->next;
			delete q;
			q = p->next;
		}else{
			p = p->next;
			q = p->next;		
		}
	}
}

/*
*函数说明:添加一个元素到已经排好序的一个链表,由小到大排序
*入口参数:Type add:将要添加的元素值
*出口参数:无
*作者:陈汝军
*日期:2014-8-17 21:44:23
*/
template<typename Type>
void SinglyLinkedNode<Type>::addNodeToOrderedLink(Type add){
	SinglyLinkedNode *p,*q;	
	q = new SinglyLinkedNode();
	q->data = add;
	p = this;
	while(p->next!=NULL && p->next->data<add){
		p = p->next;
	}
	q->next = p->next;
	p->next = q;
}

int main(void){
	int temp;
	SinglyLinkedNode<int> *head = new SinglyLinkedNode<int>();
	while(cin>>temp && temp!=-1){
		head->addNodeToOrderedLink(temp);
	}
	head->printLink();
	cin>>temp;
	head->addNodeToOrderedLink(temp);
	head->printLink();
	cin>>temp;
	head->deleteElements(temp);
	head->printLink();
	return 0;
}




你可能感兴趣的:(ACM,南邮OJ,数据的插入与删除)