数据结构与算法(2)链表

先放上来一个很好玩的网站:VisuAlgo

链表节点长什么样子

struct node{
    ElementType data;
    node *next;
};

操作

我不打算写ADT,因为我觉得ADT写出来会让人有一种惶恐感,本着实用的原则,我不想让大家还没用就有一种“天哪,这玩意这么复杂”的感觉。
这里我主要讲两种操作,只要这两种操作搞明白了,链表的增删查改也就完欧克。

创建链表

逆序创建:猫爪永远向上原理

void create()
{
    node *head=NULL;//申请头指针,这时还没有为他分配指向的实际空间。
    while(true)
    {
        node *temp=new node;//一下三步是新申请一个节点并初始化
        cin>>temp->data;
        temp->next=NULL;
        //注意了,接下来的两句是关键,很有可能看不懂,但没关系,可以看代码下的解释
        temp->next=head;
        head=temp;
        //那么何时停止呢?
        if(getchar()=='\n')
            break;//接收到回车符时停止,当然如果你是有标识的停止也可以将回车符改为任何的标志
    }
}

说了这么多,其实关键的就两句:

temp->next=head;
head=temp;

你想象一下,你和你家猫咪在玩游戏,你把你的手放在了它的爪子上(第一句),主子不肯,就又把自己的爪子放在了你的上面。如此循环。。。还要注意,这是不带头节点的。

正序创建:插入第一个节点和插入其他节点有区别

void create()
{
    node *head=NULL,*tail=NULL;
    while(true)
    {
        node *temp=new node;
        cin>>temp->data;
        temp->next=NULL;
        if(head==NULL)//插入的是第一个节点
        {
            head=temp;
            tail=temp;
        }
        else//插入的不是第一个节点
        {
            tail->next=temp;
            tail=temp;
        }
        if(getchar()=='\n') break;
    }
}

遍历链表

无论插入删除查找都离不开遍历链表。
插入无非是找到指定位置,先将新节点的下一位置指向后一位,然后修改前一位的指针指向新节点。删除无非是,找到指定位置,其前一位的指针指向其下一位,断开next指针,释放。该孤立节点。
怎么安全遍历呢??

for(node*p=head;p!=NULL;p=p->next)
{
    operation;
}

应用

猜你喜欢

转载自blog.csdn.net/tinpo_123/article/details/80468166