zoukankan      html  css  js  c++  java
  • 单链表

    单链表是一种数据的组合形式。它在插入删除数据时效率比数组高。单链表的存储空间是在程序运行时动态分配的。由于在很多应用中数据的大小在编译的时候无法确定,因此动态分配存储空间是单链表的一个优点。

    因为c库中没有现成的链表这种数据结构,所以需要开发者用结构体自己构建。

    单链表分为头节点和普通节点。尾节点也是普通节点,只不过指针指向NULL。

    构建头结点:

    1 struct Header                //头结点
    2 {
    3     int length;                //记录链表大小
    4     struct Node * next;   //指向第一个节点的指针
    5 }

    构建普通节点:

    1 struct Node                   //普通节点
    2 {
    3     int data;                   //数据域
    4     struct Node * next;    //指向下一个节点的指针
    5 }

    为了使用方便,将两个struct用typedef重新定义新的名称:

    typedef struct Node Body_node;         //将struct Node重命名为Bode_node
    typedef struct Header Head_node;      //将struct Header重命名为Head_node

    创建链表:

    1 Head_node * createList()    //Head_node是struct Header的别名,是头结点类型
    2 {
    3     Head_node * head_n = (Head_node * )malloc(sizeof(Head_node));      //为头结点分配内存
    4     head_n->length = 0;      //初始化头结点
    5     head_n->next = NULL;
    6     return head_n;       //将头结点地址返回
    7 }

    获取链表大小:

    1 int Size(Head_node * head_n)      //获取链表大小
    2 {
    3     if(head_n == NULL)
    4     {
    5         printf("参数传入错误!");
    6         return 0;
    7     }
    8     return head_n->length;
    9 }

    插入元素:

    int Insert(Head_node * head_n, int pos, int val)        //在某个位置插入某个元素,插入成功返回1
    {
        //先做健壮性判断
        if(head_n == NULL || pos < 0 || pos > head_n->length)
        {
            printf("参数传递有误!");
            return 0;    
        }
        //再向链表中插入元素时,先要找到这个位置
        Body_node * pval = (Body_node)malloc(sizeof(Body_node));   //先分配一块内存来存储要插入的数据
        pval->data = val;    //当前指针指向头结点后面的第一个节点
        Body_node * pCur = head_n->next;
        if(pos == 0)      //插入在第一个位置
        {
            head_n->next = pval;        //指针断开连接过程
            pval->next = pCur;
        }
        else
        {
            for(int i = 1;i < pos;i++)      //找到要插入的位置
            {
                pCur = pCur->next;    
            }
            pval->next = pCur->next;      //指针断开再连接的过程
            pCur->next = pval;
        }
        head_n->length++;       //增加一个元素,长度要加1
        return 1;
    }

    查找某个元素

    Body_node * find(Head_node * head_n, int val)    //查找某个元素
    {
        //先做健壮性判断
        if(head_n == NULL)
        {
            printf("参数传入有误!");
            return NULL;
        }
        //遍历链表来查找元素
        Body_node * pTmp = head_n->next;
        do
        {
            if(pTmp->data == val)
            {
                return pTmp;
            }
            pTmp = pTmp->next;
        }while(pTmp->next != NULL);  //循环条件知道链表结尾
        printf("没有值为%d的元素!", val);
        return NULL;
    }

    未完待续

  • 相关阅读:
    From使用post与使用get区别
    HTML 自动跳转代码
    mjpgstreamer译文
    DOCUMENT.GETELEMENTBYID使用
    查看Linux内核版本的命令
    CGI编程学习5 穿插HTML,CSS零星知识
    使用Javascript显示时间
    北京大学<Perl 循序渐进>
    html之marquee详解
    Apache支持ASP.NET方法浅析
  • 原文地址:https://www.cnblogs.com/junsircoding/p/singlenode.html
Copyright © 2011-2022 走看看