zoukankan      html  css  js  c++  java
  • List------Linked 链表

    1、Definition

    Linked list consists of a series of nodes. Each nodes contains the element and a pointer which points to the next node. The last node's next link points to NULL.

    Linked=data+pointer

    use the pointer to describe the logical relationship

    2、Implementation

    template<class List_entry>
    class List
    {
      public:
         List(); 
         int size();
         bool empty();
         bool full();
         ...
      protected:
         int count;
         Node<List_entry> *head;             //当声明一个linked时,只会拥有一个头指针
    }
    
    template<class List_entry>
    struct Node
    {
      List_entry entry;                            // data
      Node<List_entry> *next;               // point to the next node   
      Node();
      Node(List_entry, Node<List_entry>*link=NULL);
    }
    

    3、Operations

    (1)two types of insert

    ①在p节点所在位置插入

    New(S)
     S->data=a;
     q->next=S;
     S->next=p;
    

    ②在p节点之后插入

    New(S)
       S->data=a;
       S->next=p->next;
       p->next=S;
    

    (2) create a linked list

    In order to create a linked list, we have this algorithm

    ①To create a head

    ②To create new node S

    ③Insert S

    void CreateList(Head)
    {
       new(Head);
       Head->next=NULL;
       scanf("%c",ch);
       while(ch<>'#')do
        {
           new(S);
           S->data=ch;      
           S->next=Head->next;
           Head->next=S;
         }
    }
    

    上述构造方式为从头构造,在头元素出一个一个地插入

    下面一种是从链尾增添

    void CreateList(Head)
    {
       new(Head);
       Head->next=NULL;
       Last=Head;
       scanf("%c",ch);
       while(ch<>'#')do
       {
          new(S);
          S->data=ch;
          S->next=NULL;
          Last->next=S;
          Last=S;
        }
    }
    

    (3)insert an element at location i

    Status ListInsert L(LinkList &L, int i, DataType e)
    {
       LinkList p, s;
       p=L;
       int j=0;
    
       while(p&&j<i-1)
       {
          p=p->next;
          j++;
        }
    
       if(!p) return ERROR;
       s=(LinkList)malloc(sizeof(LNode));
       s->data=e;
       s->next=p->next;
       p->next=s;
      
       return OK;
    }
    

    (4)Delete

    Status ListDelete(LinkList &L, int i)
    {
       LinkList p, q;
       p=L;
       int j=0;
       
       while(p&&j<i-1)
       {
           p=p->next;
           j++;
        }
       
       if(!p) return ERROR;
       
        q=p->next;
        p->next=q->next;
        free(q);
    }
    

    (5)Search

    ①按位查找

    Status ListSearch(LinkList &L, int i)
    {
       LinkList p;
       int j=0;
       while(p&&j<i-1)
       {
          p=p->next;   
          j++;
       }
       if(!p)return ERROR;
       e=p->next;
       return OK;
    }
    

    ③按值查找

    Status ListSearch(LinkList &L, DataType e)
    {
       LinkList p;
       p=L;
       int j=0;
      while(p&&(p->next)!=e)
      {
             p=p->next;
             j++;
       }
       if(!p)
        {
            cout<<"Not found"<<endl;
            return ERROR;
        } 
       else
        {
            return (j);
        }
    }
    

    3、circular linked list

    4、Doubly linked list

    (1)Insert

    p->next=current->next;
    p->prior=current;
    current->next->prior=p;
    current->next=p;
    

    (2)Delete

    current->next->prior=current->prior;
    current->prior->next=current->next;
    

     C++style code

    //C++style构建链表,有头结点
    //operations
    /*
    LenList(L)链长
    GetElem(i, e)换值
    SearchElem(e, i)按值查找
    InertElem(i, e)插值
    DeleteElem(i) 删值
    */
    
    template<typename Type>
    struct Node
    {
    	Type data;
    	Node<Type>*next;
    };
    
    template<typename Type>
    class LinkList
    {
    public:
    	LinkList()
    	{
    		head = new Node<Type>;
    		head->next = NULL;
    		len = 0;
    		Type ch;
    		Node<Type>*p;
    		while (cin >> ch)
    		{
    			p = new Node<Type>;
    			p->data = ch;
    			p->next = head->next;
    			head->next = p;
    			len++;
    		}
    	}
    	~LinkList()
    	{
    		Node<Type>*p = head;
    		while (p->next)
    		{
    			DeleteElem();
    		}
    		delete head;
    	}
    
    	//LenList(L)链长
    	int LenList()
    	{
    		return len;
    	}
    
    	//InertElem(e)从尾插值
    	void InsertElem(Type e)
    	{
    		Node<Type>*p = head;
    		while (p->next)
    		{
    			p = p->next;
    		}
    
    		Node<Type>*q = new Node<Type>;
    		q->data = e;
    		q->next = p->next;
    		p->next = q;
    		len++;
    	}
    
    	//InertElem(i, e)从第i位插值
    	void InsertElem(int i, Type e)
    	{
    		Node<Type>*p = head;
    		int j = 0;
    		while (p->next && j<i - 1)
    		{
    			j++;
    			p = p->next;
    		}
    		Node<Type>*q = new Node<Type>;
    		q->data = e;
    		q->next = p->next;
    		p->next = q;
    		len++;
    	}
    
    	//GetElem(i, e)换值
    	void GetElem(int i, Type e)
    	{
    		int j = 0;
    		Node<Type>*p = head;
    		while (p->next && j<i - 1)
    		{
    			j++;
    			p = p->next;
    		}
    		p->next->data = e;
    	}
    
    	//DeleteElem(i) 第i位删值
    	void DeleteElem(int i)
    	{
    		int j = 0;
    		Node<Type>*p = new Node;
    		while (p->next && j<i - 1)
    		{
    			j++;
    			p = p->next;
    		}
    
    		Node<Type>*q = p->next;
    		p->next = q->next;
    		delete q;
    
    		len--;
    	}
    
    	//DeleteElem() 尾删值
    	void DeleteElem()
    	{
    		Node<Type>*p = head;
    		while (p->next->next)
    		{
    			p = p->next;
    		}
    		Node<Type>*q = p->next;
    		p->next = q->next;
    		delete q;
    		len--;
    	}
    
    	//SearchElem(e)按值查找
    	int SearchElem(Type e)
    	{
    		Node<Type>*p = head;
    		int i = 0;
    		while (p->next && p->data != e)
    		{
    			i++;
    			p = p->next;
    		}
    
    		if (i == 0)
    			return -1;
    		else return i;
    	}
    	//SearchElem(i)按位查找
    	Type SearchElem(int i)
    	{
    		Node<Type>*p = head;
    		int j = 0;
    		while (p->next && j<i)
    		{
    			j++;
    			p = p->next;
    		}
    		return p->data;
    	}
    
    private:
    	Node<Type>*head;
    	int len;
    };
    

      

     

  • 相关阅读:
    BZOJ 1951: [Sdoi2010]古代猪文( 数论 )
    BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
    BZOJ 1066: [SCOI2007]蜥蜴( 最大流 )
    BZOJ 1935: [Shoi2007]Tree 园丁的烦恼( 差分 + 离散化 + 树状数组 )
    BZOJ 1297: [SCOI2009]迷路( dp + 矩阵快速幂 )
    BZOJ 1406: [AHOI2007]密码箱( 数论 )
    BZOJ 1876: [SDOI2009]SuperGCD( 更相减损 + 高精度 )
    spfa2
    spfa
    bellmanford队列优化
  • 原文地址:https://www.cnblogs.com/KennyRom/p/5879716.html
Copyright © 2011-2022 走看看