1.题目:
Problem Description
对值递增有序的单链表进行以下操作:若表中存在值为x的结点,则将它从表中删除;否则,就往表中插入一个值为x的结点,并保持表值递增有序的性质不变(假设表中没有值相同的元素)。处理后若为空表则不输出。
Input
每组数据包括3行,第一行表示单链表的长度n(不会超过50);第二行表示单链表的所有元素;第三行表示x值。
Output
输出执行操作后的单链表,元素之间用一个空格分隔。
Sample Input
5
1 3 5 7 9
3
5
1 3 5 7 9
4
Sample Output
1 5 7 9
1 3 4 5 7 9
2.参考代码:
#include <iostream>
using namespace std;
struct Node{
int data;
Node* next;
};
class LinkList{
private:
Node* head;
public:
LinkList(int* a,int n);
~LinkList();
void oper(int x);
void show();
};
LinkList::LinkList(int* a,int n){
Node* r,* s;
head=new Node;
r=head;
for(int i=0;i<n;i++)
{
s=new Node;
s->data=a[i];
s->next=r->next;
r->next=s;
r=s;
}
r->next=NULL;
}
LinkList::~LinkList(){
Node* p,* q;
p=head;
while(p)
{
q=p;
p=p->next;
delete q;
}
}
void LinkList::oper(int x){ ///核心代码
Node* p,* q;
q=head;
p=q->next;
while(p && p->data<x)
{
q=p;
p=p->next;
}
if(p && p->data==x) ///如果相等就删除x
{
q->next=p->next;
delete p;
}
else ///否则插入一个新的节点,其数据域值为x
{
Node* s=new Node;
s->data=x;
s->next=p; ///修改指针
q->next=s; ///修改指针
}
}
void LinkList::show(){
Node* p=head->next;
if(p)
{
cout<<p->data;
p=p->next;
while(p)
{
cout<<" "<<p->data;
p=p->next;
}
cout<<endl;
}
}
int main()
{
int i,n,x,a[1111];
while(cin>>n)
{
for(i=0;i<n;i++)
cin>>a[i];
cin>>x;
LinkList t(a,n);
t.oper(x);
t.show();
}
return 0;
}