数据结构与算法设计——链表的头插法与尾插法

一:链表组成部分
链表由若干结点组成,每一结点又分为两部分:数据域和指针域。数据域用以存储数据元素,指针则存储下一结点(下一个数据)的地址,方便找到该数据。

struct Link{
    
    
    int date;
    struct Link *next;
};

二:链表的创建
1.尾插法创建

struct Link * create_Link_tail(struct Link *head)
{
    
    
    struct Link* tail = (struct Link*)malloc(sizeof(Link));
    tail = head;
    int len;
    cout<<"len:"<<endl;
    cin>>len;
    for(int i=0;i<len;++i)
    {
    
    
        struct Link* temp = (struct Link*)malloc(sizeof(Link));
        cin>>temp->date;
        tail->next=temp;
        tail = temp;
    }
    tail->next =NULL;
    return head;
}

创建一个与传入头指针完全一样的过度指针,始终指向新建结点temp(即始终指向链表末尾),就可以在不动头指针的前提下一只往头指针后面添加新结点。

2.头插法

struct Link* create_Link_head(struct Link* head)        
{
    
    
    int len;
    cout<<"len:"<<endl;
    cin>>len;
    for(int i=0;i<len;++i)
    {
    
    
        struct Link* temp = (struct Link*)malloc(sizeof(Link));
        cin>>temp->date;
        temp->next = head->next;
        head->next = temp;
    }
    return head;
}

新建结点的next指针指向head->next(也就是第一个Link结点),那该新建结点自然就成为了新的第一个结点,也就是head->next。

三:链表遍历

void traverse_Link(struct Link* head)       //遍历链表
{
    
    
    struct Link* ptr = (struct Link*)malloc(sizeof(Link));
    ptr = head->next;
    while(ptr!=NULL)
    {
    
    
        cout<<ptr->date<<endl;
        ptr = ptr->next;
    }
}

创建一个临时指针先指向head->next,即第一个元素,head是头不是首。然后通过while循环判断ptr是否为空,否就取出里面的date值,空即退出循环,遍历结束。

四:总结
链表及我上面的代码非常简单,很好看懂,如果看不懂,可以试试这个方法:假如创建一个结点:Link jiedian1;这个结点的下一个结点是jiedian2。死记:jiedian->next指的是jiedian2,即jiedian1->next->date就是jiedian2->date。记住了再去看看代码就显而易见了。

全部代码如下:

#include <iostream>
using namespace std;

struct Link{
    
    
    int date;
    struct Link *next;
};

struct Link * create_Link_tail(struct Link *head)
{
    
    
    struct Link* tail = (struct Link*)malloc(sizeof(Link));
    tail = head;
    int len;
    cout<<"len:"<<endl;
    cin>>len;
    for(int i=0;i<len;++i)
    {
    
    
        struct Link* temp = (struct Link*)malloc(sizeof(Link));
        cin>>temp->date;
        tail->next=temp;
        tail = temp;
    }
    tail->next =NULL;
    return head;
}

struct Link* create_Link_head(struct Link* head)        
{
    
    
    int len;
    cout<<"len:"<<endl;
    cin>>len;
    for(int i=0;i<len;++i)
    {
    
    
        struct Link* temp = (struct Link*)malloc(sizeof(Link));
        cin>>temp->date;
        temp->next = head->next;
        head->next = temp;
    }
    return head;
}

void traverse_Link(struct Link* head)       //遍历链表
{
    
    
    struct Link* ptr = (struct Link*)malloc(sizeof(Link));
    ptr = head->next;
    while(ptr!=NULL)
    {
    
    
        cout<<ptr->date<<endl;
        ptr = ptr->next;
    }
}

int main(int argc, char const *argv[])
{
    
    
    struct Link *Head = (struct Link*)(malloc(sizeof(Link)));
    create_Link_head(Head);
    traverse_Link(Head);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46061085/article/details/120471862