关于数据结构之单链表的C++实现

1、链表List的基本单元是节点Node,因此想要操作方便,就必须为每一步打好基础,Node的基本结构如下:

class Node
{
public: 
int data;
Node *next;
Node(int da=0,Node *p=NULL)
{    
this->data=da;
this->next=p; 
}
};

我们可以看出,Node的成员变量一共有两个,都是public,因为我们要对这两个变量进行操作,所以不能是private类型的。然后是一个构造函数,第二个参数默认值为NULL,也就是说如果我们创建新节点时只指定第一个参数,而不写第二个参数,那么它默认的就是NULL,以这种方式可以更灵活的使用Node,个人建议这么使用哦。
2、第二步就是创建我们的链表了,同样我们这里先给出链表的代码,在进行一一的解释。

class List
{
private: 
Node *head,*tail; 
int position;
public: 
List()
{
head=tail=NULL;
}; 
  ~List()
{
delete head;delete tail;
}; 
 void print();  
 void Insert(int da=0);
 void Delete(int da=0); 
    void Search(int da=0);
};

我们这里面有两个数据类型,一个是Node。另一个是指代节点位置的成员变量(起不到什么作用,且不去管它吧)。使用head和tail来命名便是为了见名知意,使操作更加准确。然后是重要的六个函数,各自的功能不言而喻咯,其实最重要的是在每一个函数中我们都默认能操作head和tail两个成员变量,这样能简化我们的参数列表,使得函数更加优雅。
下面是我的一个单链表的实现,包含创建链表,插入值,删除特定的值,查找特定值得在链表中的位置。

#include<iostream>
using namespace std;
class Node
{
public:
int data;
 Node *next;
   Node(int da=0,Node *p=NULL)
   {    
   this->data=da;
       this->next=p;
         }
         }; 
         class List
         {
         private:
         Node *head,*tail; 
          int position;
           public: 
           List()
        {
             head=tail=NULL
        }; 
         ~List()
         {
         delete head;
         delete tail;
         };
        void print();
        void Insert(int da=0);
        void Delete(int da=0);
        void Search(int da=0); 
        int getValueAt(int position); 
        void setValueAt(int position,int da);
      }; 
        int List::getValueAt(int position)
          {  
         Node *p=head; 
          if(p=NULL)
       {    
          cout<<"The List is Empty!"<<endl; 
       }
         else
      {    
        int posi=0; 
        while(p!=NULL&&posi!=position)
        {     
        posi++;   
        p=p->next;  
         }   
       if(p=NULL)
        {      
       cout<<"There is no value of this position in this List!"<<endl;  
     }
     else
       {     
   cout<<"In this Position,the value is"<<p->data<<endl;    
    }  
    } 
    return p->data;
   } 
    void List::setValueAt(int position,int da)
    {  
     Node *p=head; 
    if(p== NULL)
    {    
     cout<<"The List is Empty!"<<endl; 
    }
       else
       {    
    int posi=0;    
    while(p!=NULL&&posi!=position)
    {    
      posi++;      p=p->next; 
      }   
      if(p== NULL)
     {    
       cout<<"There is No Position in this List!"<<endl;   
       }
      else
      {   
       p->data=da;  
    cout<<"The Value in this position has been Updated!"<<endl;   
    } 
    }
    }
     void List::Search(int da)
     { Node *p=head;  
     if(p== NULL)
     {    
     cout<<"Sorry, The List is Empty!"<<endl; 
        return ; 
       }  
      int count=0; 
       while(p!=NULL&&p->data!=da)
       { 
          p=p->next;    count++; 
       }  
       cout<<"the value you want to search is at position %d"<<count<<endl;}
          void List::Delete(int da)
       { 
        Node *p=head,*q=head;  
        if(  p== NULL)
       {
           cout<<"Sorry, The List is Empty!"<<endl;    return; 
            } 
        while(p!=NULL&&p->data!=da)
        {   
         q=p;    p=p->next; 
          }  
        q->next=p->next; 
         cout<<"The Deletion Operation had been finished!"<<endl;}
          void List::Insert(int da)
          {
          if(head==NULL)
          {  
            head=tail=new Node(da);   
           head->next=NULL;  
           tail->next=NULL;  
             }
             else
             {  
       Node *p=new Node(da);  
        tail->next=p;  
        tail=p;  
        tail->next=NULL; 
        } 
       } 
       void List::print()
      {  
        Node *p=head;  
        while(p!=NULL)
        {  
       cout<<p->data<<" \a";  
       p=p->next;  } 
       cout<<endl;} 
       int main()
        { 
        cout<<"Hello World!"<<endl; 
         List l1; 
         l1.Insert(1);  
        l1.Insert(2); 
        l1.Insert(3);  
        l1.Insert(4); 
        l1.Insert(5); 
        l1.Insert(6);  
        l1.Insert(7);  
        l1.print(); 
        l1.Search(4); 
        l1.Delete(6); 
        l1.print(); 
        l1.getValueAt(3);  
        l1.setValueAt(3,9); 
        l1.print();  
        cout<<"The End!"<<endl;  
     return 0;
       }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值