单链表的冒泡排序以及逆序(交换指针法)

来源:互联网 发布:美国动画产业 知乎 编辑:程序博客网 时间:2024/06/16 04:35
      一直苦于单链表进行排序操作,在博客上看到好多的链表排序都是以值交换为主,实在是很难受。自己有一个需求就是写一个单链表的冒泡排序和逆序。然后自己也写了值交换法的单链表冒泡排序和逆序,希望能对需要帮助的朋友产生一些启发,当然本人的水平有限,写的不好,请大家指导。

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

// 链表结构体

typedef struct _Node
{
    int data;// 数据域
    struct _Node *next;//指针域
}Node, *LinkList;

// 头插法建表

void InsertHead(LinkList *pHead, int value)
{
    LinkList pNew = (LinkList)malloc(sizeof(Node));
    if (NULL == pNew)
    {
        printf("动态申请内存失败!\n");
    }
    pNew->data = value;
    pNew->next = *pHead;
    *pHead = pNew;
}

// 尾插法建表

void DelTail(LinkList *pHead)
{
    while (NULL != *pHead)
    {

        LinkList temp = *pHead;
        (*pHead) = temp->next;
        free(temp);
        temp = NULL;
    }

}

// 显示函数

void Show(LinkList pHead)
{
    while (NULL != pHead)
    {
        printf("%d    ", pHead->data);
        pHead = pHead->next;
    }
    printf("\n");

}

// 获取链表长度

int GetLength(LinkList pHead)
{
    int count = 0;
    while (NULL != pHead)
    {
        count++;
        pHead = pHead->next;
    }
    return count;
}

// 单链表冒泡排序

void BubleSort(LinkList *pHead)
{
    int i;
    LinkList pCur = NULL;
    LinkList pNext = NULL;
    LinkList ppHead = NULL;
    int len = GetLength(*pHead);
    
    // 前插一个头节点
    InsertHead(pHead,0);

    for (i = 0; i < len-1; i++)
    {
        for (ppHead = *pHead; pCur =ppHead->next, pNext = pCur->next, pNext!=NULL;)
        {
            if (pCur->data>pNext->data)
            {
                pCur->next = pNext->next;
                pNext->next = pCur;
                ppHead->next = pNext;
                ppHead = ppHead->next;
                pNext = pCur->next;
            }
            else
            {
                ppHead = ppHead->next;
                pCur = pCur->next;
                pNext = pNext->next;
            }
        }
    }

    // 删除头节点
    LinkList temp = (*pHead);
    *pHead  = temp->next;
    free(temp);
    temp = NULL;
}

// 单链表逆序

void Reverse(LinkList *pHead)
{
    
    int i;
    int len = GetLength(*pHead);   // 获取链表的长度

    // 前插一个头节点
    InsertHead(pHead, 0);


    LinkList pCur = (*pHead)->next;
    
    for (i = 0; i < len - 1; i++)
    {
        LinkList pNext = pCur->next;
        LinkList ppNext = pNext->next;

        LinkList temp = NULL;
        if (pNext== NULL)
        {
            break;

        }
        else
        {
        //    temp = pCur;
            pNext->next = (*pHead)->next;
            pCur->next = ppNext;
            (*pHead)->next = pNext;
        }
    }

    // 删除头节点
    LinkList temp = (*pHead);
    *pHead = temp->next;
    free(temp);
    temp = NULL;
}

int main(void)
{

    int i;
    LinkList pHead = NULL;
    for (i = 0; i < 10; i++)
    {
        InsertHead(&pHead, i + 1);
    }
    printf("建完表后各个节点的数据为:\n");
    Show(pHead);

    printf("\n链表的长度为:\n%d\n", GetLength(pHead));
    BubleSort(&pHead);
    printf("冒泡排序后的顺序为:\n");
    Show(pHead);

    printf("逆序后的顺序为:\n");
    Reverse(&pHead);
    Show(pHead);

    DelTail(&pHead);
    return 0;
}

   
0 0
原创粉丝点击