加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 正文

C++中链表操作实例分析

发布时间:2021-01-11 19:35:45 所属栏目:创业 来源:网络整理
导读:链表概述 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用

    first = NULL;
    while(head != NULL)          //在链表中找键值最小的节点
    {
        //注意:这里for语句就是体现选择排序思想的地方
        for (p = head,min = head; p->next != NULL; p = p->next)    //循环遍历链表中的节点,找出此时最小的节点
        {
            if (p->next->num < min->num)     //找到一个比当前min小的节点
            {
                p_min = p;          //保存找到节点的前驱节点:显然p->next的前驱节点是p
                min = p->next;      //保存键值更小的节点
            }
        }

        //上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表

        //第一件事
        if (first == NULL)       //如果有序链表目前还是一个空链表
        {
            first = min;        //第一次找到键值最小的节点
            tail = min;           //注意:尾指针让它指向最后的一个节点
        }
        else              //有序链表中已经有节点
        {
            tail->next = min;       //把刚找到的最小节点放到最后,即让尾指针的next指向它
            tail = min;              //尾指针也要指向它
        }

        //第二件事
        if (min == head)            //如果找到的最小节点就是第一个节点
        {
            head = head->next;       //显然让head指向原head->next,即第二个节点,就OK
        }
        else            //如果不是第一个节点
        {
            p_min->next = min->next;    //前次最小节点的next指向当前min的next,这样就让min离开了原链表
        }
    }

    if (first != NULL)        //循环结束得到有序链表first
    {
        tail->next = NULL;    //单向链表的最后一个节点的next应该指向NULL
    }
    head = first;
    return head;
}

对链表进行直接插入排序的基本思想就是假设链表的前面n-1个节点是已经按键值(就是用它排序的字段,我们取学号num为键值)排好序的,对于节点n在这个序列中找插入位置,使得n插入后新序列仍然有序。按照这种思想,依次对链表从头到尾执行一遍,就可以使无序链表变为有序链表。

      单向链表的直接插入排序图示:
      ---->[1]---->[3]---->[2]...---->[n]---->[NULL](原链表)
     head   1->next  3->next  2->next   n->next

      ---->[1]---->[NULL](从原链表中取第1个节点作为只有一个节点的有序链表)
     head
     图11

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读