没想到这几个的链表操作还是有不多人看的,所以这样才让我的有信心继续的写下去,毕竟有了激励才有继续走下去的勇气。写了头插式的链表操作之后就有了写完尾插的想法,没想到还是写了,接下来就是尾插的代码。
//创建链表的小函数
#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_tail(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;
}
insert_tail(pHeader, create_node(1));
insert_tail(pHeader, create_node(2));
insert_tail(pHeader, create_node(3));
insert_tail(pHeader, create_node(4));
insert_tail(pHeader, create_node(5));
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_tail(Node *pH, Node *new)
{
Node *Ptmp = NULL;
do {
Ptmp = pH;
}
while ((pH = pH->pNext) != NULL);
Ptmp->pNext = new;
}
最后一个函数就是尾插节点的函数,跟头插是一样的变量。但是思路是完全不一样的,尾插是一直遍历节点的,直到到达节点的下一个节点为NULL,尾插需要记录NULL之前的节点,所以我这里是利用了do---while这种循环,因为这里害怕传进来的头指针就是只有头指针而没有节点,所以就是先赋值后判断往后面的节点走。while判断里面的语句是用于往后面的节点走的,Ptmp = pH;这条语句就是用于记录NULL前的节点地址,最后一条语句用于插入新节点。
//创建链表的小函数
#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_tail(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;
}
insert_tail(pHeader, create_node(1));
insert_tail(pHeader, create_node(2));
insert_tail(pHeader, create_node(3));
insert_tail(pHeader, create_node(4));
insert_tail(pHeader, create_node(5));
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_tail(Node *pH, Node *new)
{
Node *Ptmp = NULL;
do {
Ptmp = pH;
}
while ((pH = pH->pNext) != NULL);
Ptmp->pNext = new;
}
最后一个函数就是尾插节点的函数,跟头插是一样的变量。但是思路是完全不一样的,尾插是一直遍历节点的,直到到达节点的下一个节点为NULL,尾插需要记录NULL之前的节点,所以我这里是利用了do---while这种循环,因为这里害怕传进来的头指针就是只有头指针而没有节点,所以就是先赋值后判断往后面的节点走。while判断里面的语句是用于往后面的节点走的,Ptmp = pH;这条语句就是用于记录NULL前的节点地址,最后一条语句用于插入新节点。