您的位置:首页 > 理论基础 > 数据结构算法

记录自已学习之单链表(逆序)

2017-04-28 19:08 267 查看
今天就来说一下单链表的最后一个操作了,那就是逆序输出了。其实说到逆序输出,在baidu上也有许多的逆序输出,但在这里我还是想要说一下我看到了方法,我觉得还是挺好用的。

//创建链表的小函数

#include <stdio.h>

#include <stdlib.h>

typedef struct node

{
int num;
struct node *pNext;

}Node;

//创建节点函数的声明

Node *create_node(int cnt);

//遍历链表的函数声明

void traverse_node(Node *pH);

//逆序链表

void reversed_list(Node *pH);

//头插式插入链表

void insert_head(Node *pH, Node *new);

int main(void)

{
//定义一个头指针,指向第一个节点
Node *pHeader = NULL;

pHeader = (Node *)malloc(sizeof(struct node));
if (NULL == pHeader)
{
printf("malloc failure\n");
return 0;
}

//由于头指针一般不存数据,所以赋值为0
pHeader->num = 0;
insert_head(pHeader, create_node(4));
insert_head(pHeader, create_node(3));
insert_head(pHeader, create_node(2));
insert_head(pHeader, create_node(1));

traverse_node(pHeader);
printf("-------------After operation--------------\n");
reversed_list(pHeader);
traverse_node(pHeader);

return 0;

}

//创建节点函数

Node *create_node(int cnt)

{
Node *Tmp = NULL;

Tmp = (Node *)malloc(sizeof(struct node));
if (NULL == Tmp)
{
printf("In create_node, malloc failure\n");
return NULL;
}

//将函数的传参赋值,并将pNext指向NULL
Tmp->num = cnt;
Tmp->pNext = NULL;
return Tmp;

}

//遍历链表的节点

void traverse_node(Node *pH)

{
while ( (pH = pH->pNext) != NULL)
{
printf("num = %d\n", pH->num);
}

}

//头插式插入链表

void insert_head(Node *pH, Node *new)

{
Node *pTmp = NULL;
if (NULL != pH->pNext)
{
pTmp = pH->pNext;
pH->pNext = new;
new->pNext = pTmp;
}
else
{
pH->pNext = new;
}

}

//逆序链表

void reversed_list(Node *pH)

{
//指向当前节点的指针
Node *pCur = pH->pNext;
//指向下一个节点的指针
Node *pnext = NULL;
//判断是否存在节点或是否只有一个节点
if ((NULL == pCur->pNext) || (NULL == pCur))
{
return ;
}
//判断是否已经到达节点尾
while (NULL != pCur->pNext)
{
//这两条语句用于交换两个节点的属性,也就是各自的pNext
pnext = pCur->pNext;
pCur->pNext = pnext->pNext;
//下面两条语句就用于头插式
pnext->pNext = pH->pNext;
pH->pNext = pnext;
}

}

还是像原来的一样,那就是把高潮都放在了最后。Node *pCur = pH->pNext;这条语句就是让头结点后面第一个节点赋值给pCur这个当前节点。到达while的是实际上pCur这个指针一直指向的是头结点pHeader后面的第一个节点,也就是num = 1这个节点。pnext这个节点用于交换节点。pnext = pCur->pNext;首先让它记录pCur的下一个节点位置,pCur->pNext = pnext->pNext;然后让pCur的pNext指向下下个节点的位置,也就是num
= 3的这个位置。pnext->pNext = pH->pNext;这条语句让pnxet的pNext指向头节点的下一个节点,刚刚开始还是num = 1的这个节点,但在后面它是不断的变化,因位全靠头插式逆序的。pH->pNext = pnext;这条语句就用于改变头指针下一个节点的位置。我大概说一下整体思路,开始是用一个pCur记住的num = 1的这个节点,它是由始到终没有变过的,但是最后跟它的pNext指向的节点都交换的属性,也就是说把它指向的下一个节点都用头插式提到前面去了。最后它是跟num
= 4在这条语句交换属性,让num = 1的这个节点的pNext指向了NULL作为链表结尾。

最后大家可以参照一下这篇博客的图片,跟我说的挺像的:http://blog.csdn.net/duxd1989/article/details/32312655
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息