练习三——单链表
#include <iostream>
using namespace std;
class List;
class LinkNode{
friend List;
private:
LinkNode *link;
int data;
public:
LinkNode(LinkNode *ptr=NULL){
link=ptr;
}
LinkNode(const int &item,LinkNode *ptr=NULL){
data=item;
link=ptr;
}
~LinkNode(){}
};
class List{
private:
LinkNode *first;
public:
List(){
first=new LinkNode();
}
void MakeEmpty();
~List(){MakeEmpty();}
LinkNode *getHead() const {
return first;
}
void input(int EndTag);
void output();
LinkNode *Find(int x);
LinkNode *Locate(int i);
int GetData(int i,int &x);
void SetData(int x,int i);
int Insert(int x,int i);
int Remove(int &x,int i);
};
void List::input(int EndTag) {
int val;
LinkNode *newnode;
cin>>val;
while(val!=EndTag){
newnode=new LinkNode(val);
newnode->link=first->link;
first->link=newnode;
cin>>val;
}
}
void List::output(){
LinkNode *p=first->link;
while(p!=NULL){
cout<<p->data<<endl;
p=p->link;
}
}
void List::MakeEmpty(){
LinkNode *p;
while(first->link!=NULL){
p=first->link;
first->link=p->link;
delete p;
}
}
LinkNode *List::Find(int x){
LinkNode *p=first->link;
while(p!=NULL){
if(p->data==x){
break;
}
p=p->link;
}
return p;
}
LinkNode *List::Locate(int i){
if(i<=0){
return NULL;
}
LinkNode *p=first;
int j=0;
while(p!=NULL&&j<i){
p=p->link;
}
return p;
}
int List::GetData(int i,int &x){
LinkNode *p=Locate(i);
if(p!=NULL){
x=p->data;
return 1;
}
else return 0;
}
void List::SetData(int x,int i){
if(i<=0) return ;
LinkNode *p=Locate(i);
if(p!=NULL)
p->data=x;
}
int List::Insert(int x,int i){
LinkNode *p=Locate(i);
if(p==NULL){
return 0;
}
LinkNode *newNode=new LinkNode(x);
newNode->link=p->link;
p->link=newNode;
return 1;
}
int List::Remove(int &x,int i){
LinkNode *p=Locate(i-1),*q;
if(p==NULL){
return 0;
}
q=p->link;
p->link=q->link;
x=q->data;
return 1;
}
int main(){
List l;
l.input(0);
l.output();
}