单链表排序(冒泡排序,借助temp),原理精讲

结构体定义

typedef struct _Node{
	int data;
	struct _Node* next;
}node;

这是一段单链表排序的函数,其中使用了临时变量temp

void link_order(SLink* p_head) {
    SLink* pb, * pf, temp;
    pf = p_head;
    if (p_head == NULL) {//链表为空
        printf("needn't order.\n");
        return;
    }
    if (p_head->next == NULL) {//链表有1个节点
        printf("only one print, needn't order.\n");
        return;
    }
    while (pf->next != NULL) {//以pf指向的节点为基准节点
        pb = pf->next;//pb从基准点的下一个节点开始
        while (pb != NULL) {
            if (pf->data > pb->data) {
                temp = *pf;
                *pf = *pb;
                *pb = temp;
                temp.next = pf->next;
                pf->next = pb->next;
                pb->next = temp.next;
            }
            pb = pb->next;
        }//while
        pf = pf->next;
    }
    return;
}

先来说下指针

好多人单纯看可能很顺利,但是如果走一步,让你画一个图,或者讲出具体就困难了,下面我来说下。
首先,指针这一概念必须清楚,指针是指向某一块地址,而那个地址真是保存数据的地方,当我们用*解引用,我们便能得到那块地址保存的数据。
指针p是指向这个地址的,并不是指向x保存的值,此时我们*p得到的值是100

如果我们把x的值改成200,那又会是什么
指针p是指向这个地址的,并不是指向x保存的值,此时我们*p得到的值是200
所以,我们得到结论,一个指针指向的是一块地址,跟他里里面的值没关系!

我们再来看给出的交换节点代码

上面声明了 SLink* pb, * pf, temp;

if (pf->data > pb->data) {
       temp = *pf;
      *pf = *pb;
      *pb = temp;
      temp.next = pf->next;
      pf->next = pb->next;
      pb->next = temp.next;
}

一共有六句代码,我们分别画出每走一步的示意图,让大家彻底理解!
初始是这样的
在这里插入图片描述
在这里插入图片描述
画的比较潦草哈哈哈,快来让你对指针的理解更上一层楼!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值