单链表的c++实现操作

xiaoxiao2021-02-28  36

  

看别人写的,自己又写一遍。仅供自己学习。

//单链表的操作

 #include<iostream>  using namespace std;  typedef int DataType;  #define Node ElemType  #define ERROR NULL    //构建一个节点类  class Node{   public:   int data;//数据域    Node *next;//指针域   };     //构建一个单链表类  class LinkList{   private:    ElemType *head;//头结点    public:   LinkList();//构造函数    ~LinkList();//析构函数    void CreateLinkList(int n);//创建一个单链表    void TravalLinkList();//遍历线性表 int GetLength();//获取线性表长度 bool IsEmpty();//判断单链表是否为空  ElemType *Find(DataType data);//查找节点  void InsertElemAtEnd(DataType data);//在尾部插入指定元素 void InsertElemAtIndex(DataType data,int n);//在指定位置插入指定元素 void InsertElemAtHead(DataType data);//在头部插入指定元素  void DeleteElemAtEnd();//删除尾部元素 void DeleteAllElem();//删除全部元素 void DeleteElemAtPoint(DataType data);//删除指定的数据 void DeleteElemAtHead();//删除头部节点   };     //初始化单链表  LinkList::LinkList()//构造函数   {   head = new ElemType;   head->data = 0;//将头结点的数据域定义为0    head->next = NULL;//将头节点的指针域设置为null   }     //销毁单链表  LinkList::~LinkList()//析构函数   {   delete head;      //删除头结点   }     //创建一个单链表  void LinkList::CreateLinkList(int n)  {   ElemType *pnew,*ptemp;   ptemp = head;   if(n<0)   {   cout<<"输入的节点个数有误"<<endl;   }   for(int i = 0;i<n;i++)   {   pnew = new ElemType;   cout<<"请输入第"<<i+1<<"个值:";   cin>>pnew->data;//输入新节点的数据域    pnew->next = NULL;//新节点下一个地址为null ptemp->next = pnew;//将当前节点的指针域指向新节点 ptemp = pnew;    //将当前节点设置为新节点    }  }      //遍历单链表  void LinkList::TravalLinkList()   {   if(head == NULL||head->next == NULL)   {   cout<<"链表为空表"<<endl;   }   ElemType *p = head;//令指针指向头结点 while(p->next!=NULL)//当指针指向的下一个地址不为空  { p = p->next;//p指向p的下一个地址  cout<<p->data<<" "; }   }     //获取单链表的长度  int LinkList::GetLength()   {   int count = 0;   ElemType *p = head->next;   while(p!=NULL)   {   count++;   p = p->next;   }   return count;  }     //判断链表是否为空  bool LinkList::IsEmpty()   {   if(head->next == NULL)   {   return true;   }   return false;  }     //查找与元素data相同的节点  ElemType * LinkList::Find(DataType data)  {   ElemType *p = head;   if(p==NULL||p->next==NULL)//为空表时    {   cout<<"此单链表为空表"<<endl; return ERROR;    }   else{   while(p->next!=NULL)   {   if(p->data==data)   {   return p;   }   p = p->next;   }   }  }      //在尾部插入指定元素  void LinkList::InsertElemAtEnd(DataType data)  {   ElemType *newNode = new ElemType;   newNode->data = data;   newNode->next = NULL;   ElemType *p = head;   if(head == NULL)//如果头结点为空时,设置newNode为头结点 {      head = newNode;  else { while(p->next!=NULL)  p = p->next;        p->next = newNode; }  }     //在指定位置插入指定元素  void LinkList::InsertElemAtIndex(DataType data,int n)  {   if(n<1||n>GetLength())   {   cout<<"输入的值有误"<<endl;   }   else{   ElemType *ptemp = new ElemType;   ptemp->data = data;   ElemType *p = head;//创建一个指针指向头结点 int i = 1; while(n>i) { p = p->next; i++; ptemp->next = p->next; p->next = ptemp;   }  }      //在头部插入指定元素  void LinkList::InsertElemAtHead(DataType data)  {   ElemType *newNode = new ElemType;//定义一个Node节点指针newNode newNode->data = data; ElemType *p = head; if(head == NULL) { head = newNode; newNode->next = p->next; p->next = newNode;  }      //在尾部删除元素  void LinkList::DeleteElemAtEnd()   {   ElemType *p = head;   ElemType *ptemp = NULL;   if(p->next = NULL)   {   cout<<"单链表为空"<<endl;   }   else{   while(p->next!=NULL)   {   ptemp = p;   p = p->next;   }   delete p;   //p = NULL;   ptemp->next = NULL;   }  }     //删除所有数据  void LinkList::DeleteAllElem()   {   ElemType *p = head->next;   ElemType *ptemp = new ElemType;   while(p!=NULL)   {   ptemp = p;   p = p->next;   head->next = p;   ptemp->next = NULL;   delete ptemp;   }   head->next = NULL;//头结点的下一个节点指向NULL,即为空表   }     //删除指定元素  void LinkList::DeleteElemAtPoint(DataType data)  {   ElemType *ptemp = Find(data);//返回元素的序号 if(ptemp == head->next)//判断是否是头结点的下一个节点 { DeleteElemAtHead(); }     else{     ElemType *p = head;     while(p->next != ptemp)     {     p = p->next;     }     p->next = ptemp->next;     delete ptemp;     //ptemp = NULL;      }  }      //在头部删除节点  void LinkList::DeleteElemAtHead()   {   ElemType *p = head;   if(p == NULL || p->next == NULL)//为空表 { cout<<"单链表为空表"<<endl; else { ElemType *ptemp = NULL; p = p->next; ptemp = p->next; delete p; //p = NULL; head->next = ptemp; }  }       //测试函数  int main()  {   LinkList list;   int i;   cout << "1.创建单链表   2.遍历单链表   3.获取单链表的长度   4.判断单链表是否为空   5.获取节点\n";   cout << "6.在尾部插入指定元素   7.在指定位置插入指定元素   8.在头部插入指定元素\n";   cout<<"9.在尾部删除元素   10.删除所有元素   11.删除指定元素   12.在头部删除元素   0.退出" << endl;   do { cout<<"请输入要执行的操作:"; cin>>i; switch(i) { case 1: int n; cout<<"请输出要创建单链表的长度:"; cin>>n; list.CreateLinkList(n); break; case 2: list.TravalLinkList(); break;     case 3: cout<<"该单链表长度为"<<list.GetLength()<<endl; break; case 4: if(list.IsEmpty() == 1) cout<<"单链表是空表"<<endl; else cout<<"链表不是空表"<<endl; break; case 5: DataType data; cout<<"请输入要获取节点的值:"; cin>>data; cout<<"该节点的值为" << list.Find(data)->data << endl; break; case 6: DataType endData;                 cout << "请输入要在尾部插入的值: ";                 cin >> endData;                 list.InsertElemAtEnd(endData);                 break;        case 7:         DataType pointData;         int index;         cout<<"请输入要插入的数据:";         cin >> pointData;         cout << "请输入要插入数据的位置: ";         cin >> index;         list.InsertElemAtIndex(pointData, index);         break;         case 8:                 DataType headData;                 cout << "请输入要在头部插入的值: ";                 cin >> headData;                 list.InsertElemAtHead(headData);                 break;        case 9:            list.DeleteElemAtEnd();            break;        case 10:            list.DeleteAllElem();            break;        case 11:            DataType pointDeleteData;            cout << "请输入要删除的数据: ";            cin >> pointDeleteData;            list.DeleteElemAtPoint(pointDeleteData);            break;        case 12:            list.DeleteElemAtHead();            break;        default:            break;        }    } while (i != 0);    return 0; }      
转载请注明原文地址: https://www.6miu.com/read-2628146.html

最新回复(0)