代码改变世界

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;

  }

}