zoukankan      html  css  js  c++  java
  • 链表

    链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”)。链表主要分为3大类:单项链表,双向链表,循环链表,下面以单向链表为例。单向链表的操作包括创建、删除、  插入(无序、有序)、输出、  排序(选择、插入、冒泡)、反序等等。

    一.设计数据结构

    //单链表

    typedef struct node

    {

        int    data; //数据

        struct node *pNext;

    }Node,*pLinkedList;

     

    1.创建链表

    pLinkedList CreateNode(int  data)

    {

        Node *pNode = (Node *)malloc(sizeof(Node));

        if(pNode)

        {

            pNode->data = data;

            pNode->pNext = NULL;

        }

        return  pNode;

    }

    定义一个打印链表的函数

    void Print( Node *head)

    {

        Node *p;

        p = head;

        if(head != NULL)

        {

            while (p != NULL)

            {

                printf ("%p %d ", p, p->data);

                p =(Node*)p->pNext; //移到下一个节点

            }

        }

    }

    //创建有5个节点的单链表

    pLinkedList CreateNodesExample()

    {

        pLinkedList headNode =  CreateNode(0);

        pLinkedList pTemp = headNode;

        for (int i = 1; i<5; i++)

        {

           pTemp->pNextCreateNode(i);

           pTemp = pTemp->pNext;

        }

        return headNode;

    }

    调用下面的代码

     pLinkedList pHead =  CreateNodesExample();

    Print(pHead);printf(" ");

    日志如下:

      0x100301380 0 

      0x100301390 1 

      0x1003013a0 2 

      0x100303220 3 

      0x100303230 4 

     

    2.反转链表

      

    //反转链表

    pLinkedList  Reverse (pLinkedList pHead)

    {

        Node *pTemp;       //临时存储

        Node *pResult;     //存储返回结果

        Node *pCurrent;    //源节点一个一个取

        pResult = NULL;    //开始颠倒时,已颠倒的部分为空

        pCurrent = pHead;  //pCurrent指向链表的头节点

        while(pCurrent != NULL)

        {

            pTemp = pCurrent->pNext;

            pCurrent->pNext =pResult;

            pResult = pCurrent;

            pCurrent = pTemp;

        }

        pHead = pResult;

        return pHead;

    }

    调用

    pHead = Reverse(pHead);

    Print(pHead);printf(" ");

    日志:

     0x100303230  4 

    0x100303220  3 

    0x1003013a0  2 

    0x100301390  1 

    0x100301380  0

     

    OC下可以用NSArray NSDictonary代替,如果自己实现,代码如下

     

    @interface LinkedList : NSObject

     @property (nonatomic,strong) NSNumber *number;

    @property (nonatomic,strongLinkedList *nextNode;

     @end

    //反转

     - (LinkedList *)reserverLinkedLink:(LinkedList *)node

    {

        LinkedList *tempNode;    //临时存储

        LinkedList *currentNode; //当前节点

        LinkedList *resultNode;  //转换后的新链表

        resultNode = nil;

        currentNode = node;

        while (currentNode) {

            tempNode =  currentNode.nextNode;

            currentNode.nextNode =  resultNode;

            resultNode =  currentNode;

            currentNode =  tempNode;

        }

        return resultNode;

    }

     

     

  • 相关阅读:
    SEMI-PARAMETRIC TOPOLOGICAL MEMORY FOR NAVIGATION
    Global Pose Estimation with an Attention-based Recurrent Network
    ACTIVE NEURAL LOCALIZATION
    VidLoc: A Deep Spatio-Temporal Model for 6-DoF Video-Clip Relocalization
    PoseNet: A Convolutional Network for Real-Time 6-DOF Camera Relocalization
    ActionScript 3操作XML 详解
    关于RPG游戏结构撰写的相关探索下篇
    关于RPG游戏结构撰写的相关探索上篇
    象棋人机对弈程序的思想
    Install mcrypt for php on Mac OSX 10.10 Yosemite for a Development Server
  • 原文地址:https://www.cnblogs.com/menchao/p/5210401.html
Copyright © 2011-2022 走看看