链表C++实现

    技术2022-05-19  19

    Node.h                                                            //第一个文件

    #ifndef NODE_H #define NODE_H #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define NULL 0 #define flag -1 class Node { public:     int data;     Node *next; }; #endif //NODE_H

     

    linklist.h                                                            //第二个文件

    #ifndef LINKLIST_H #define LINKLIST_H #include "Node.h" class LinkList { public:     LinkList( );//constructor     LinkList(LinkList &L);//copy construtor     LinkList &operator =(const LinkList &L);//overload operator '='     void Createlist(int n);//use the datas you put in to create a list     void CleanList( );//clean the list     bool IsListEmpty( )const;//determine whether the list is empty or not     void InsertOfList(int i,int value);//insert value before i'th node     void DeleteOfList(int pos);//delete the i'th node     void SortList( );//sort the list     int LenOfList( )const;//calculate the length of the list     int GetElem(int pos);//get pos'th node data     void ShowList( )const;//show the data of the list          friend void Merge(LinkList &La,LinkList &Lb,LinkList &Lc);//merge two list into one     ~LinkList( );//destructor private:     Node *head; }; #endif //LINKLIST_H

     

     

     

    linklist.cpp                                                       //第三个文件

    #include <iostream> #include <iomanip> #include "linklist.h" using namespace std; LinkList::LinkList( )                 //construtor of LinkList {     head = new Node;                  //dynamic application memory space     head->next = NULL;                //it's pointer points to NULL     cout <<endl<<"the constructor called"<<endl<<endl; } LinkList::LinkList(LinkList &L)       //copy construtor {     head = new Node;     head->next = NULL;     if(L.head)     {         Node *p = new Node;         p = L.head->next;              //use temporary node q to record L's node         while(p)         {             Node *temp = new Node;      //temporary node,used to record L's data             temp->data = p->data;             temp->next = head->next;    //insert node temp into the list             head->next = temp;             p = p->next;         }     } } LinkList &LinkList::operator =(const LinkList &L)  //overload operator '=' {     head = new Node;     head->next = NULL;     Node *p = new Node;     p = L.head->next;                    //use temporary node q to record L's node     while(p)     {         Node *temp = new Node;          //temporary node,used to record L's data         temp->data = p->data;         temp->next = head->next;         head->next = temp;         p = p->next;     }     return *this; } void LinkList::Createlist(int n)     //use the datas you put in to create a list {     head = new Node;     head->next = NULL;     if(n > 0)     {         cout <<"now please input "<<n<<" datas:"<<endl;         for(int i = 0;i < n;i++)         {             Node *temp = new Node;          //temporary node to save the data you put in             cin >>temp->data;             temp->next = head->next;             head->next = temp;         }              }     else if(n==0)     {         cout <<"no data to put in!"<<endl;          }     else     {         cout <<"Illegal length!"<<endl<<endl;         exit(NULL);     } } void LinkList::CleanList( )                        //clean the list {     cout <<"clear the list now!"<<endl;     head->next = NULL;     } bool LinkList::IsListEmpty( )const                  //determine whether the list is empty or not {     if(head->next == NULL)     {         cout <<"the list is empty"<<endl<<endl;         return TRUE;     }     else     {         cout <<"not an empty list"<<endl<<endl;         return FALSE;     } } void LinkList::InsertOfList(int i,int value)       //insert value before i'th node {     Node *p = new Node;     p = head;     int count = 0;     while(p && count < i-1)                       //search for (i-1)'th node     {         p = p->next;         count++;     }     if(!p || count > i-1)                         //i<1 or have been the end of the list     {         cout <<"one of the position to insert in is illegal!"<<endl;         cout <<"the illegal position is: "<<i<<endl;         exit(ERROR);     }     Node *temp = new Node;                         //use value to new a node     temp->data = value;     temp->next = p->next;                          //insert the node into the list     p->next = temp; } void LinkList::DeleteOfList(int pos)               //delete the i'th node {     Node *p = new Node;     p = head;     int count = 0;     while(p->next && count < pos-1)               //search the i'th node,and put p points its precursor     {         p = p->next;         count++;     }     if(!(p->next) || count > pos-1)     {         cout <<"one of the position to delete is illegal!"<<endl;         cout <<endl<<"the illegal position is: "<<pos<<endl<<endl;         exit(ERROR);     }     Node *temp = new Node;                        //temporary node used to record pos'th node     temp = p->next;     p->next = temp->next;                         //delete pos'th node and cout the data         cout <<endl<<temp->data<<" has been delete from the list"<<endl<<endl;     delete temp; } void LinkList::SortList( )                        //sort the list {     cout <<endl<<"now the list is beening sorting..."<<endl<<endl;     Node *p = new Node;     p = head->next;     Node *temp1 = new Node;     Node *temp2 = new Node;     while(p)     {         temp1 = p;         temp2 = p->next;         while(temp2)         {             if(temp2->data < temp1->data)             {                 int TempData = temp2->data;                 temp2->data = temp1->data;                 temp1->data = TempData;             }             temp2 = temp2->next;         }         p = p->next;     } } int LinkList::LenOfList( )const                  //calculate the length of the list {     int len = 0;     Node *p = new Node;     p = head->next;     while(p)     {         len++;         p = p->next;     }     return len; } int LinkList::GetElem(int pos)                    //get pos'th node data {     int record;     Node *p = new Node;     p = head->next;     int count = 1;     while(p && count < pos)                      //search for i'th node,until p points to i'th node or NULL     {         p = p->next;         count++;     }     if(!p || count > pos)         exit(ERROR);     record = p->data;     return record; } void LinkList::ShowList( )const                    //show the data of the list {     Node *p = new Node;     p = head->next;     if(IsListEmpty()==TRUE)         cout <<endl<<"the list is null"<<endl<<endl;     while(p)     {         cout <<setw(5)<<p->data;         p = p->next;     }     cout <<endl<<endl; } void Merge(LinkList &La,LinkList &Lb,LinkList &Lc)        //merge two list into one {     Node *pa = new Node;     pa = La.head->next;                                   //use pa to record La's node     Node *pb = new Node;     pb = Lb.head->next;                                   //use pb to record La's node     Lc.head = new Node;     Lc.head->next = NULL;         while(pa!=NULL && pb!=NULL)                             //neither La nor Lb is NULL                       {         Node *r= new Node;                                //temporary node,used to record the data         if(pa->data < pb->data)                           //La's data < Lb's data         {             r->data = pa->data;             pa = pa->next;         }         else                                              //Lb's data < La's data         {             r->data = pb->data;             pb = pb->next;         }         r->next = Lc.head->next;                          //insert node r into Lc         Lc.head->next = r;     }     while(pa!=NULL)                                       //La is not NULL     {         Node *r= new Node;         r->data = pa->data;         pa = pa->next;         r->next = Lc.head->next;         Lc.head->next = r;     }     while(pb!=NULL)                                       //Lb is not NULL     {         Node *r= new Node;         r->data  =pb->data;         pb = pb->next;         r->next = Lc.head->next;         Lc.head->next = r;     } //    delete r; } LinkList::~LinkList( )                             //the destructor of LinkList {     cout <<"the list is destroyed!"<<endl<<endl;     delete head; }

     

     

    testcode.cpp                                                             //测试代码

    #include <iostream> #include "linklist.h" using namespace std; int main( ) {     cout <<"how many element in list one?";     int n;     cin >>n;     LinkList L1,L2,L;     L1.Createlist(n);     cout <<"how many element in list two?";     int m;     cin >>m;     L2.Createlist(m);     L1.SortList( );     L2.SortList( );     Merge(L1,L2,Ll);          L.ShowList();     return 0; }


    最新回复(0)