链表

链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以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 \n", 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("\n");

日志如下:

  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("\n");

日志:

 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;

}

 

 

 

posted @ 2016-02-23 16:32  行藏在我  阅读(311)  评论(0编辑  收藏  举报