zoukankan      html  css  js  c++  java
  • 单向链表实现

    单向链表

    单链表有一个头节点head,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为NULL。

    <a href="http://www.emacsvi.com/wp-content/uploads/2015/10/linkedlist.bmp"><img src="http://www.emacsvi.com/wp-content/uploads/2015/10/linkedlist.bmp" alt="linkedlist" width="600" height="130" class="alignnone size-full wp-image-274" /></a>

    <pre lang="c" escaped="true">

    /* linkedlist.h */
    #ifndef LINKEDLIST_H
    #define LINKEDLIST_H

    typedef struct node *link;
    struct node
    {
    unsigned char elem;
    link next;
    };

    link make_node(unsigned char elem);
    void free_node(link p);
    link search(unsigned char elem);
    void insert(link p);
    void delete(link p);
    void traverse(void (*visit)(link));
    void destroy(void);
    void push(link p);
    link pop(void);

    #endif

    </pre>


    <pre lang="c" escaped="true">

    #include <stdlib.h>
    #include "linkedlist.h"

    static link head=NULL;

    link make_node(unsigned char elem)
    {
    link p = malloc(sizeof(*p));
    p->elem = elem;
    p->next = NULL;
    return p;
    }

    void free_node(link p)
    {
    free(p);
    }

    link search(unsigned char elem)
    {
    link p;
    for (p = head; p; p = p->next)
    if (elem == p->elem)
    return p;
    return NULL;
    }

    void insert(link p)
    {
    p->next = head;
    head = p;
    }

    void delete(link p)
    {
    link pre;
    if (head == p)
    {
    head = p->next;
    return;
    }
    for (pre = head; pre; pre = pre->next)
    if (pre->next == p)
    {
    pre->next = p->next;
    return;
    }
    }

    /* 没有看太明白
    void delete(link p)
    {
    link *pnext;
    for (pnext = &head; *pnext; pnext = &(*pnext)->next)
    if (*pnext == p)
    {
    *pnext = p->next;
    return;
    }
    }
    */

    void traverse(void (*visit)(link))
    {
    link p;
    for (p = head; p; p = p->next)
    visit(p);
    }

    void destroy(void)
    {
    link q, p=head;
    head = NULL;
    while (p)
    {
    q = p;
    p = p->next;
    free_node(q);
    }
    }

    void push(link p)
    {
    insert(p);
    }

    link pop(void)
    {
    if (NULL == head)
    return NULL;
    else
    {
    link p = head;
    head = head->next;
    return p;
    }
    }

    </pre>


    <pre lang="c" escaped="true">

    #include <stdio.h>
    #include "linkedlist.h"

    void print_elem(link p)
    {
    printf("%d ", p->elem);
    }

    int main(void)
    {
    link p;

    insert(make_node(10));
    insert(make_node(5));
    insert(make_node(90));
    p = search(5);
    delete(p);
    free_node(p);
    traverse(print_elem);
    destroy();
    push(make_node(100));
    push(make_node(200));
    push(make_node(250));
    while (p = pop())
    {
    print_elem(p);
    free_node(p);
    }

    return 0;
    }

    </pre>

  • 相关阅读:
    GB28181 流媒体几种数据传输模式UDP、TCP(被动、主动)
    LiveGBS
    利用ffmpeg采集纯音频推流到LiveQing实现RTMP、FLV、HLS web直播与录像回放
    LiveQing高性能RTMP、FLV、HLS视频流媒体服务器软件如何自定义修改成自己的服务软件名称
    LiveQing
    LiveQing直播流媒体服务解决直播录像存储、直播录像回看、直播录像计划排班配置
    GB28181流媒体服务LiveGBS前端源码(vue+webpack)
    LiveNVR
    华为、科达、海康、大华等厂家摄像头通过非标方式(RTSP)接入流媒体服务实现WEB直播与录像
    LiveNVR RTSP流媒体服器软件通过按需直播降低企业服务带宽
  • 原文地址:https://www.cnblogs.com/liweilijie/p/4984181.html
Copyright © 2011-2022 走看看