zoukankan      html  css  js  c++  java
  • 【数据结构】C语言判断链表是否为空,计算链表长度及链表排序算法

          今天继续学习了链表,这次是检测链表是否为空,计算链表长度,这都是蛮简单的,最后就是给链表排序,这里的链表排序是当然是最简单的冒泡排序。

    还是希望和新手一起学习,希望得到大牛指点······

          这次代码还是基于上次 C语言实现链表的创建及遍历链表这个文章中的代码,直接在这上面写的,添加的,检测是否为空函数,计算链表长度函数,和链表排序函数,好了,上代码了。


    /*
                链表创建,遍历,检测是否为空,计算链表长度,排序

           编译环境:VC++ 6.0
           编译系统:windows XP SP3
    */

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

    //    定义链表中的节点
    typedef struct node
    {
        int member;                //    节点中的成员
        struct node *pNext;        //    指向下一个节点的指针
    }Node,*pNode;

    //    函数声明
    pNode CreateList();                 //  创建链表函数
    void TraverseList(pNode );            //  遍历链表函数
    bool Is_Empty(pNode);                //    判断链表是否为空
    int LengthList(pNode);                //    计算链表长度函数    
    void Sort_List(pNode);                //    链表排序函数

    int main()
    {
        pNode pHead = NULL;                //  定义初始化头节点,等价于 struct Node *pHead == NULL
        int flag;                        //    存放链表是否为空的标志,
        int Len;
        pHead = CreateList();            //  创建一个非循环单链表,并将该链表的头结点的地址付给pHead
        TraverseList(pHead);            //  调用遍历链表函数
        if (Is_Empty(pHead) == true)    //    判断列表是否为空
        {
            return 0;
        }
        Len = LengthList(pHead);                //    调用计算链表长度函数
        printf("链表长度: %d 个节点。\n",Len);    
        Sort_List(pHead);                //    排序函数
        
        return 0;
    }

    //    创建链表函数
    pNode CreateList()
    {
        int i;                                            //    用于下面循环
        int len;                                        //    用来存放有效节点的字数
        int val;                                        //    用于临时存放用户输入的数据
        pNode pHead = (pNode)malloc(sizeof(Node));        //  分配一个不存放有效数据的头结点
        pNode pTail = pHead;                            //    链表的最后一个节点
        pTail->pNext = NULL;                            //    最后一个节点的指针置为空
        printf("请输入节点个数:");
        scanf("%d",&len);
        for(i = 0; i < len; i++)
        {
            printf("第 %d 个节点的数值:",i+1);
            scanf("%d",&val);
            pNode pNew = (pNode)malloc(sizeof(Node));    //    为节点分配空间
            pNew->member = val;                            //将用户输入的数据赋给节点的成员
            pTail->pNext = pNew;                        //将最后一个节点的指针指向下一个新的节点
            pNew->pNext = NULL;                            //将新节点中的指针置为空
            pTail = pNew;                                //将新节点赋给最后的一个节点
        }
        return pHead;                                    //返回头节点

    }

    //    遍历链表函数
    void TraverseList(pNode pHead)
    {
        pNode p = pHead->pNext;                            //将头节点的指针给予临时节点p
        while(NULL != p)                                //节点p不为空,循环    
        {
            printf("%d ",p->member);                    
            p = p->pNext;                                
        }
        printf("\n");
        return ;
    }

    //    判断链表是否为空
    bool Is_Empty(pNode pHead)
    {
        if (NULL == pHead->pNext)                        //判断头节点的指针部分是否为空
        {
            printf ("链表为空!\n");
            return true;
        }
        else
        {
            return false;
        }
    }

    //    计算链表长度--------是不是发现和遍历链表函数很像
    int LengthList(pNode pHead)
    {
        int length = 0;
        pNode n = pHead->pNext;
        while(NULL != n)
        {
            ++length;
            n = n->pNext;
        }
        return length;
    }

    //    链表排序-----冒泡排序
    void Sort_List(pNode pHead)
    {
        int i,j;        
        int swap;            //存放交换数据的临时变量
        int len = LengthList(pHead);    //获取链表长度
        pNode m,n;        
        
        for (i = 0,m = pHead->pNext; i < len - 1; i++,m = m->pNext)
        {
            for (j = i + 1,n = m->pNext;j < len; j++,n = n->pNext)
            {
                if (m->member < n->member)                    
                {
                    swap = m->member;
                    m->member = n->member;
                    n->member = swap;
                }
            }
        }
        printf("排序完后结果为:");
        TraverseList(pHead);
        return ;


    欢迎大神指正批评·······新手一起学习······ 

  • 相关阅读:
    linux命令整理
    各种提权姿势总结
    常用端口信息说明和利用
    近年来爆发的CVE漏洞编号
    一个优秀的SSH远程终端工具
    python-读写文件的方式
    kali安装ssh服务
    一套实用的渗透测试岗位面试题
    使用 python快速搭建http服务
    asciinema使用
  • 原文地址:https://www.cnblogs.com/scrat/p/2642555.html
Copyright © 2011-2022 走看看