Detailed explanation of linear table single chain table

1, Definition of linked list

Linked list is a kind of dynamic data structure, which is characterized by using a set of arbitrary storage units (can be continuous or discontinuous) to store data elements. Every element in the list is called "node". Each node is composed of data field and pointer field. The pointer field in each node points to the next node. Head is the "head pointer", indicating the beginning of the linked list, which is used to point to the first node, while the pointer field of the last pointer is null (null address), indicating the end of the linked list. It can be seen that the linked list structure can only be realized by using pointers, that is, a node must contain a pointer variable to store the address of the next node. In fact, each node in the linked list can use several data and several pointers. A linked list with only one pointer in a node is called a single linked list, which is the simplest linked list structure.

2, Advantages and disadvantages of chain storage

advantage:

  • Insert, delete do not need to move other elements, just change the pointer
  • The space of each node in the linked list is not required to be continuous in memory, and the space utilization rate is high

Disadvantages:

  • Search needs traversal operation, which is troublesome

3, Code implementation

#include<iostream>
using namespace std;


class Node {
public:
    Node() {
        data = 0;
        next = NULL;
    }
    Node(int el, Node *ptr = NULL) {
        data = el;
        next = ptr;
    }
    void printNode()
    {
        cout<<data<<"->";
    }
    int data;
    Node *next;
};

class LinkList
{
public:
    LinkList();//Constructor
    ~LinkList();//Destructor
    void ClearLinkList();//Empty list
    bool LinkListEmpty();//Empty list
    int LinkListLength();//Chain length
    bool GetElem(int i, Node *pNode);//Gets the element of the specified index
    int LocateElem(Node *pNode);//Gets the index of the specified element
    bool PriorElem(Node *pCurrentNode, Node *pPreNode);//Get precursor node
    bool NextElem(Node *pCurrentNode, Node *pNextNode);//Get successor node
    void LinkListTraverse();//ergodic
    bool LinkListInsert(int i,Node *pNode);//Insert element
    bool LinkListDelete(int i, Node *pNode);//Delete element
    bool LinkListInsertHead(Node *pNode);//Insert after head node
    bool LinkListInsertTail(Node *pNode);//Insert at the end of the list
private:
    Node * m_pLinkList;
    int m_iLength;
};

//Constructor
//In the heap, memory is requested for the header node m ﹣ plinklist
//M ﹣ plinklist data field set to 0
//In fact, a header node is declared here. The header node has no successor node and the data field is empty
//Length set to 0
LinkList::LinkList()
{
    m_pLinkList = new Node;
    m_iLength = 0;
}

//Destructor
//Call to clear the linked list method
//Delete head node and empty
LinkList::~LinkList()
{
    ClearLinkList();
    delete m_pLinkList;
    m_pLinkList = NULL;
}

//Empty list
void LinkList::ClearLinkList()
{
    Node *currentNode = m_pLinkList->next;
    while (currentNode != NULL)
    {
        Node *temp = currentNode->next;
        delete currentNode;
        currentNode = temp;
    }
    m_pLinkList->next = NULL;
}

//Empty list
bool LinkList::LinkListEmpty()
{
    return 0 == m_iLength ? true : false;
}

//Get length
int LinkList::LinkListLength()
{
    return m_iLength;
}

//Insert element after head node
bool LinkList::LinkListInsertHead(Node *pNode)
{
    Node *temp = m_pLinkList->next;
    Node *newNode = new Node;
    if (newNode == NULL) //Determine whether the requested node memory is empty
    {
        return false;
    }
    else
    {
        newNode->data = pNode->data;
        m_pLinkList->next = newNode;
        newNode->next = temp;
        m_iLength++;
        return true;
    }
}

//Insert element after end node
bool LinkList::LinkListInsertTail(Node *pNode)
{
    Node *currentNode = m_pLinkList;
    while (currentNode->next != NULL)
    {
        currentNode = currentNode->next;
    }
    Node *newNode = new Node;
    if (newNode == NULL)
    {
        return false;
    }
    else
    {
        newNode->data = pNode->data;
        newNode->next = NULL;
        currentNode->next = newNode;
        m_iLength++;
        return true;
    }
}

//Insert element at specified location
bool LinkList::LinkListInsert(int i, Node *pNode)
{
    if (i<0 || i>m_iLength)
    {
        return false;
    }
    Node *currentNode = m_pLinkList;
    for (int k = 0; k < i; k++)
    {
        currentNode = currentNode->next;
    }
    Node *newNode = new Node;
    if (newNode == NULL) //Determine whether the requested node memory is empty
    {
        return false;
    }
    else
    {
        newNode->data = pNode->data;
        newNode->next = currentNode->next;
        currentNode->next = newNode;
        return true;
    }
}

//Delete element
bool LinkList::LinkListDelete(int i, Node *pNode)
{
    if (i<0 || i>=m_iLength)
    {
        return false;
    }
    Node *currentNode = m_pLinkList;
    Node *currentNodeBefore = NULL;
    for (int k = 0; k <= i; k++)
    {
        currentNodeBefore = currentNode;
        currentNode = currentNode->next;
    }
    currentNodeBefore->next = currentNode->next;
    pNode->data = currentNode->data;
    delete currentNode;
    m_iLength--;
    return true;
}

//Gets the element of the specified index
bool LinkList::GetElem(int i, Node *pNode)
{
    if (i<0 || i >= m_iLength)
    {
        return false;
    }
    Node *currentNode = m_pLinkList;
    for (int k = 0; k <= i; k++)
    {
        currentNode = currentNode->next;
    }
    pNode->data = currentNode->data;
    return true;
}

//Gets the index of the specified element
int LinkList::LocateElem(Node *pNode)
{
    Node *currentNode = m_pLinkList;
    int count = 0;
    while (currentNode->next != NULL)
    {
        currentNode = currentNode->next;
        if (currentNode->data == pNode->data)
        {
            return count;
        }
        count++;
    }
    return -1;
}

//Get precursor node
bool LinkList::PriorElem(Node *pCurrentNode, Node *pPreNode)
{
    Node *currentNode = m_pLinkList;
    Node *tempNode = NULL;
    int count = 0;
    while (currentNode->next != NULL)
    {
        tempNode = currentNode;
        currentNode = currentNode->next;
        if (currentNode->data == pCurrentNode->data)
        {
            if (tempNode == m_pLinkList)
            {
                return false;
            }
            pPreNode->data = tempNode->data;
            return true;
        }
    }
    return false;
}

//Get successor node
bool LinkList::NextElem(Node *pCurrentNode, Node *pNextNode)
{
    Node *currentNode = m_pLinkList;
    while (currentNode->next != NULL)
    {
        currentNode = currentNode->next;
        if (currentNode->data == pCurrentNode->data)
        {
            if (currentNode->next == NULL)
            {
                return false;
            }
            pNextNode->data = currentNode->next->data;
            return true;
        }
    }
    return false;
}

//ergodic
void LinkList::LinkListTraverse()
{
    Node *currentNode = m_pLinkList;
    while (currentNode->next != NULL)
    {
        currentNode = currentNode->next;
        currentNode->printNode();
    }
}

int main() {

    //Create a linked list
    LinkList l_list;
    for(int i = 1; i<10; i++)
    {
        Node node(i);
        l_list.LinkListInsertTail(&node);
    }

    //Get link length
    cout<<"LinkListLength:"<<l_list.LinkListLength()<<endl;

    //Insert node
    Node node(22);
    l_list.LinkListInsertHead(&node);
    Node node_2(33);
    l_list.LinkListInsertTail(&node_2);
    Node node_3(44);
    l_list.LinkListInsert(2,&node_3);

    //Delete node
    Node *node_4;
    l_list.LinkListDelete(1, node_4);
    cout<<"LinkListDelete:"<<node_4->data<<endl;

    //Get the specified location element
    Node node_5;
    l_list.GetElem(1, &node_5);
    cout<<"GetElem:"<<node_5.data<<endl;

    //Gets the index of the specified element
    Node node_6(2);
    int index = l_list.LocateElem(&node_6);
    cout<<"index:"<<index<<endl;

    //Get precursor node
    Node node_7;
    Node node_8(44);
    l_list.PriorElem(&node_8, &node_7);
    cout<<"PriorElem:"<<node_7.data<<endl;

    //Get successor node
    l_list.NextElem(&node_8, &node_7);
    cout<<"PriorElem:"<<node_7.data<<endl;

    //ergodic
    l_list.LinkListTraverse();
    return 0;
}

Posted by bubblegum.anarchy on Mon, 04 May 2020 08:16:56 -0700