C语言---12单链表---02链表的使用PLUS

一、链表的逆序

(一)图解

1、使用pb、pr来记录断开后的节点地址

  • 在反向链接(1与2)前需要断开当前节点与后续节点的链接(2与3的链接)

将2、3断开,2的指针指向1

 2、移动pb、head形成循环

  • 将2变为头节点,重复操作1
3与2链接,需要断开3、4

3、循环后

 4、代码演示

 

(二)代码实现(重要)

STU* reverse_link(STU *head)
{
    // 判断链表是否存在
    if(head == NULL)
    {
        printf("链表创建失败\n");
        return;
    }
    else
    {
        STU *pb,*pr; // 结构体指针类型
        pb = head‐>next; // pb保存head‐>next(原因head‐>next会置NULL)
        head‐>next = NULL; // 将head‐>next置NULL (原因:头节点变尾节点)
        
        while(pb != NULL)
        {
            pr = pb‐>next; // pr保存pb‐>next (原因:pb‐>next会指向head)
            pb‐>next = head; // pb‐>next 指向 head (原因:逆转方向)
            head = pb;  //保存 逆转方向的代码 可以重复 执行
            pb = pr;
        }
        return head;
    }
    return head;
}

 

二、链表的排序

(一)选择法排序(以数组实现)

1、图解 

 2、代码实现

#include<stdio.h>
int main()
{
    int arr[10]={0};
    int n = sizeof(arr)/sizeof(arr[0]);
    int i=0, j=0, min=0;

    printf("请输入%d个int数据\n", n);
    for(i=0;i<n;i++)
    {
        scanf("%d", arr+i);
    }

    // 选择法排序
    for(i=0;i<n‐1;i++)
    {
        min=i; // 记录给定的最小的数
        for(j=min+1; j<n;j++)
        {
            if(arr[min] > arr[j])
                min = j;
        }

        if(min != i)
        {
            int tmp = 0;
            tmp = arr[i];
            arr[i]=arr[min];
            arr[min]=tmp;
        }

    }

    for(i=0;i<n;i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");

    return 0;
}

 

(二)选择法排序(以链表实现)

1、图解

 2、代码实现

void sort_link(STU *head)
{
    // 判断链表是否存在
    if(NULL == head)
    {
        printf("链表创建失败\n");
        return;
    }
    else
    {
        STU *p_i = head; // i=0
        while(p_i‐>next != NULL) // i<n‐1 外层循环
        {
            STU *p_min = p_i;//min = i;
            STU *p_j = p_min‐>next; // j = min+1
            while(p_j != NULL) // j<n 内层循环
            {

                // 寻找成员num最小值的 节点
                if(p_min‐>num > p_j‐>num) // if(arr[min] > arr[j])
                    p_min = p_j; // min = j
                p_j = p_j‐>next; // j++

            }

            if(p_min != p_i)//min != i
            {
                // 只交换数据域(1、节点内容整体交换 2、只交换指针域)
                // 1、节点内容整体交换(数据域交换第1次 指针域交换第1次)
                STU tmp;
                tmp = *p_i;
                *p_i = *p_min;
                *p_min = tmp;

                // 2、只交换指针域(指针域交换第2次)
                tmp.next = p_i‐>next;
                p_i‐>next = p_min‐>next;
                p_min‐>next = tmp.next;
            }


            p_i = p_i‐>next; // i++
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盾山狂热粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值