1.什么是遍历
遍历就是把单链表的各个节点挨个拿出来,一个不能少,也不能重复,追求效率。
2.如何遍历单链表
(1)分析数据结构的本身特点,然后根据根据它本身的特点制定相应的遍历算法。
(2)单链表的特点就是有多个节点组成,头指针+头结点为整个链表的开始,最后一个节点的特点是它内部的pNext指针值为NULL。从起点到结尾中间由各个节点内部的pNext指针来挂接,并且路径只有一条。
(3)遍历方法:从头指针+头节点开始,顺着指针依次访问各个节点,取出各个节点的数据,直到最后一个节点,结束返回。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//构建链表节点
struct node
{
int data; //有效数据
struct node *pNext; //指向下一个节点的指针
};
//函数功能,创建链表节点
//返回值:指针,指向我们本函数新创建的一个节点的首地址
struct node *creat_node(int data)
{
//创建一个链表节点
struct node *p = (struct node *)malloc(sizeof(struct node));
if(NULL == p)
{
printf("malloc error\n");
return NULL;
}
//清理申请到的堆内存
// void bzero(void *s, size_t n);
bzero(p,sizeof(struct node));
//填充节点
p->data = data;
p->pNext = NULL; //将来要指向下一个节点的首地址
return p;
}
/重头部加入新节点
void insert_head(struct node *pH,struct node *new)
{
/* 方法一:
//第一步:新节点的pNext指向第一个节点
new->pNext = pH->pNext;
//第二部:头结点的pNext指向新节点
pH->pNext = new;
//第三部:头结点的计数加1
pH->data += 1;
*/
//方法二:
//先保存第一个节点
struct node *p1 = pH->pNext;
//让头结点的pNext指向新节点
pH->pNext = new;
//新节点的pNext指向保存好的第一个节点
new->pNext = p1;
//头结点计数加1
pH->data += 1;
}
//单链表遍历函数,pH为单链表的头指针,遍历的节点数据打印出来(无头结点遍历)
void bianli(struct node *pH)
{
//struct node *p = pH; 头指针后面是头节点这样初始化下面会打印头结点的数据
struct node *p = pH->pNext;
printf("开始遍历==================\n");
//pH->data; //头结点的数据,不算链表的常规数据
while(NULL != p->pNext)
{
printf("node data = %d\n",p->data);
p = p->pNext;
}
printf("node data = %d\n",p->data); //这种方法解决了最后一个节点内内打印不出来的问题,但效果不好
printf("遍历完成==================\n");
}
//有头节点遍历
void bianli2(struct node *pH)
{
struct node *p = pH; //头指针后面是头节点这样初始化下面会打印头结点的数据
printf("开始遍历==================\n");
while(NULL != p->pNext)
{
p = p->pNext;
printf("node data = %d\n",p->data);
}
printf("遍历完成==================\n");
}
int main(void)
{
//定义头指针
//struct node *pHeader = NULL; 这里如果把pHeader赋值为NULL在加入节点这个函数内就会出现段错误
struct node *pHeader = creat_node(0);
insert_head(pHeader,creat_node(1));
insert_head(pHeader,creat_node(2));
insert_head(pHeader,creat_node(3));
printf("header node data = %d\n",pHeader->data); //打印有多少个节点
bianli(pHeader);
bianli2(pHeader);
return 0;
}