C++单向链表实现
2017-12-28 19:21 彬少608 阅读(175) 评论(1) 收藏 举报#include<iostream>
using namespace std;
typedef int DataType;
typedef Node Element;
typedef ERROR NULL;
struct Node{
public:
int data;
Node* next;
};
class LinkList{
public:
LinkList();
~LinkList();
void createLinkList(int n);
void travalLinkList();
int getLength();
bool isEmpty();
Element* find(DataType data);
void insertElementAtEnd(DataType data);
void insertElementAtHead(DataType data;
void insertElementAtIndex(DataType data, int n);
void deleteElementAtEnd();
void deleteElementAtHead();
void deleteAll();
void deleteElementAtIndex(DataType data);
private:
Element *head;
}
LinkList::LinkList(){
head=new Element;//指向结构体对象
head->data=0;
head->next=NULL;
}
LinkList::~LinkList(){
delete head;
}
void LinkList::createLinkList(int n){
Element* pnew,ptmp;
ptmp=head;
if(n<0){
cout<<"输入有误!"<<endl;
exit(EXIT_FAILURE);
}
for(int i=0;i<n;i++)
pnew=new Element;
cout<<"输入第"<<i++<<"个值“;
cin>>pnew->data;
pnew->next=NULL;
ptmp->next=pnew;
ptmp=pnew;
}
void LinkList::travalLinkList(){
if(head==NULL || head->next==NULL){
cout<<"链表为空"<<endl;
}
Element* p=head;
while(p->next!=NULL){
p=p->next;
cout<<p->data<<endl;
}
}
int LinkList::getLength(){
int count=0;
Element *p=head->next;//不包括head
while(p!=NULL){
count++;
p=p->next;
}
}
bool LinkList::isEmpty(){
if(head->next!=NULL)
return true;
else
return false;
}
Element* LinkList::find(DataType data){
Element *p=head;
if(p=NULL){
cout<<"链表为空"<<endl;
return ERROR;
}
else{
while(p->next!=NULL){
if(p->data==data)
return p;
p=p->next;
}
return NULL;
}
}
void LinkList::insertElementAtEnd(DataType data){
Elememt *newp=new Element;
newp->next=NULL;
newp->data=data;
Element *p=head;
if(head=NULL) head=newp;
else{
while(p->next!=NULL)
p=p->next;
p->next=newp;
}
}
void LinkList::insertElementAtIndex(DataType data,int n){
if(n<1 || n>getLength()){cout<<"输入值有误“<<endl;}
else{
Element *p=new Element;
p->next=NULL;
p->data=data;
Element *phead=head;
int i=1;
while(n>i)
phead=phead->next;
i++;
p->next=phead->next;
phead->next=p;
}
}
void LinkList::insertElementAtHead(DataType data){
Element *p=new Element;
p->next=NULL;
p->data=data;
Element *phead=head;
if(head==NULL) head=p;//在head之后增加
p->next=phead->next;
phead->next=p;
}
void Linklist::deleteElememtAtEnd(){
Element *p=head;
Element *ptmp=NULL;
if(p->next==NULL){
cout<<"链表为空"<<endl;
}
else{
while(p->next!=NULL){
ptmp=p;
p=p->next;
}
delete p;
p=NULL;
ptmp->next=NULL;
}
}
void LinkList::deleteAll(){
Element *p=new Element;
Element *phead=head->next;
while(phead!=NULL){
p=phead;//要删除的前一个
phead=phead->next;//要删除的Node
head->next=phead;
p->next=NULL;
delete p;
}
head->next=NULL;
}
void LInkList::deleteElementAtIndex(DataType data){
Element *p=find(data);
if(p==head->next)
deleteElementAtHead();
else{
Element *phead=head;
while(phead->next!=p)
phead=phead->next;
phead->next=p->next;
p=NULL;
delete p;
}
}
void LinkList::deleteElementAtHead(){
Element *p=head;
if(p==NULL || p->next==NULL)
cout<<"链表为空"<<endl;
else{
Element *ptmp=new Element;
p=p->next;
ptmp=p->next;
delete p;
p=NULL;
head->next=ptmp;
}
}
浙公网安备 33010602011771号