双链表的插入排序


/* 总结: 学习上没有天赋,又沉不住气。经常敲着敲着代码然后几个指针上来一通乱指之后自己都搞不清处状况了。
 * 所以我现在只能慢慢摸索、尝试,并用一些我自己好理解的注释来帮住自己来理解。
 * 作为一个大一大二都在无所事事的学渣渣来说 想稍微弄明白一些 C语言 方面的知识真的不是一件容易的事。
 * 特别是每当同学们嗨嗨皮皮的就搞定的代码我却需要琢磨好一阵,那种失落感还真让人感伤。
 * 每次都想放弃,一觉醒来又会对自己说 光光别害怕。慢慢来。
 * 没错! 我相信,未来的路还很长。那些杀不死我的只会让我变得更强!!明天又会是不一样的一天!
 *                                                                                                                                                              晚安。
 *
 *   Now that can not kill me can make me stronger!
 *
 */                                                             开飞机的光光  12年12月10日 凌晨2:42.


#include <stdio.h>
#include <stdlib.h>

typedef struct _D_Node   //链表中的元素。
{
    int data;
    struct _D_Node *pre;
    struct _D_Node *next;
}Node,*pNode;


typedef struct _D_List     //链表
{
    struct _D_Node Head;//定义一个头结点 而不是一个头指针。
    struct _D_Node *Tail;
    unsigned size;
}List,*pList;



void InsertionSortList (pList mylist)             //直接插入排序。

{
    mylist->Tail = mylist->Head.next;
    pNode ptr = mylist->Tail->next;               //使 Tail 和 ptr 分别首先指向链表的第二、三个结点。
    pNode tmp = ptr->next;                        // 标识 ptr 每次排序后返回的...呃..的“故乡”。
    mylist->Tail->next = NULL;
    ptr->pre = NULL;                              // 先让 Tail 和 ptr 分手!!!

    while (ptr)
    {
        if (mylist->Tail->data < ptr->data && mylist->Tail->next == NULL)          //case 1
        {
            mylist->Tail->next = ptr;
            ptr->pre = mylist->Tail;
            ptr->next = NULL;
        }

        else if (mylist->Tail->data > ptr->data
                                      && mylist->Tail->pre->data < ptr->data)     //case 2)
        {
             ptr->next = NULL;
             ptr->pre = mylist->Tail->pre;
             ptr->next = mylist->Tail;
             mylist->Tail->pre->next = ptr;
             mylist->Tail->pre = ptr;
        }
        else                                                                                  // Tail 依次跳到它的前一个结点,然后返到上面的条件处进行比较。
        {                                                                                       //满足则执行,要不然就继续跳回到它的前一个结点处..直到满足条件。
             mylist->Tail = mylist->Tail->pre;                           //值得一提的是,因为初始化的时候已经将头结点的值设为0,所以
             continue;                                                                 //以上两种情况即可涵盖整个可能。
        }

        while (mylist->Tail->next != NULL)                            //特!别!注!意!!  比较和排序一次完成后一定要将尾指针
        {                                                                                       //跳到链表的尾部啊亲!!!!
             mylist->Tail = mylist->Tail->next;                          //就是因为这一点一直Debug 到现在啊摔!!!
        }

        ptr = tmp;                                                                        //  故乡!!!ptr 曾经在此玩耍过!!
        if (tmp != NULL)
        {
            tmp = tmp->next;
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值