您的位置:首页 > 编程语言 > C语言/C++

单链表的c++实现操作

2018-03-15 20:54 302 查看
  
看别人写的,自己又写一遍。仅供自己学习。
//单链表的操作
 #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
4000
;
  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;
}

   
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: