记录自已学习之单链表(头插)

前两篇博文已经写过了怎么创建链表和遍历链表,现在就是轮到了插入指针的时候了。插入指针好像有挺多的方式,这次我先来讲的是头插式插入指针。


//创建链表的小函数
#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 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));

#if 0
pHeader->pNext = create_node(1);
pHeader->pNext->pNext = create_node(2);
pHeader->pNext->pNext->pNext = create_node(3);
#endif


traverse_node(pHeader);


#if 0
printf("num = %d\n", pHeader->pNext->num);
printf("num = %d\n", pHeader->pNext->pNext->num);
printf("num = %d\n", pHeader->pNext->pNext->pNext->num);
#endif


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;
}
}



这里最后一个函数就是头插式插入指针的函数,函数是接受两个结构体的参数,一个是头指针,一个是新创建的链表。具体的思路就是先判断传进来的头指针是否只要一个头指针而没节点,如果是的话就直接插入就行了,如果不是就要需要一个中间变量来记录未插入时头指针的后一个节点,然后利用头指针指向新节点,然后新节点指针刚刚保存原来头指针的下一个节点。pTmp是一个创建的变量,用于作中间变量。首先时一个判断if (NULL != pH->pNext),判断头指针有没有节点,如果没有就直接插入,有的话就按照pTmp = pH->pNext;先用中间变量pTmp来存储头指针的下一个节点,pH->pNext = new;然后用头指针指向新创建的指针,最后让new的pNext指向刚刚存储在中间变量的指针,也就是没插入前的头指针的下一个指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值