1.(4)数据结构之链表的操作,判空,求长度,排序

 本人坚持更新C语言,数据结构,操作系统,前端知识,可以收藏+关注随时了解😜😜😜


目录

1.链表的长度 

2.链表的判空

3.链表的排序


上一篇文章我们讲到了链表的创建和遍历,这一篇我们来实现链表的判空,求长度,以及排序

在实现之前,我们还是需要知道一个重要的知识

确定一条链表我们只需要知道它的头节点

我们先定义好结构体

typedef struct Node
{
    int data;           //数据域
    struct Node *pNext; //指针域
} NODE, *PNODE;         // NODE等于struct Node,PNODE等价于struct Node*

1.链表的长度 

首先我们知道这个函数需要返回一个整型变量,也就是它的长度,其次我们要知道这条链表的头节点,来确定出整条链表,最后我们要知道,链表的长度,不包括头结点,链表的最后一个结点指针域为NULL

在这个链表中,除了头节点意外,有3个结点,所以长度为3,

我们的思路是,定义一个指针,指向头节点

前三个的节点的指针域不为空,头结点的指针域保存第一个节点的地址,第二个结点保存着第三个节点的地址......根据这个思想我们写出代码

int length_list(PNODE pHead)
{
    PNODE p = pHead; //定义指向头结点的指针
    int count = 0;   //计数
    while (p->pNext != NULL)
    {
        count++;
        p = p->pNext;
    }
    return count;
}

 每记一次数,通过p->pNext让指针后移,知道p->pNext等于NULL的时候(到了最后一个结点),停止循环,此时的count为链表的长度

2.链表的判空

链表的判空十分简单,如果头节点的指针域为NULL,说明这个链表只存在头节点,链表为空

反之如果不NULL,则链表不空

bool empty(PNODE pHead)
{
    if (pHead->pNext == NULL)
    {
        return true;
    }
    else
    {
        return false;
    }
}

3.链表的排序

我们在之前的学习中,学习过一些排序方式,有选择排序,冒泡排序这两种基本的排序,在链表的排序中,我们也可以使用这样的思想。

冒泡排序就是比较数组中相邻两个数的值,如果前面的数大,就交换两个数的值,这样一次循环下来,保证最后一个数是最大的

但是链表不能通过索引值去比较大小,因此我们需要定义两个指针,这两个指针是相邻的位置

pfront开始指向首节点,pbehind代表pfront后面的值,每比较一次,就将指针们向后移动一位

void sort_list(PNODE pHead)
{
    int i, j, temp;
    int len = length_list(pHead); //传入链表的长度
    PNODE pfront, qbehind;
    for (i = 0, pfront = pHead->pNext; i < len - 1; i++, pfront = pfront->pNext)
    // pfront先指向首节点,qbehind为pfront后面的结点
    {
        for (j = i + 1, qbehind = pfront->pNext; j < len; j++, qbehind = qbehind->pNext)

        {
            if (pfront->data > qbehind->data) //并没有交换指针域,只是交换了数据域
            {
                temp = pfront->data;
                pfront->data = qbehind->data;
                qbehind->data = temp;
            }
        }
    }
}

 我们需要清楚的是,排序仅仅交换的是节点的数据域的值,而没有交换指针域

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱打羽毛球的程序员

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

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

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

打赏作者

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

抵扣说明:

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

余额充值