1、头插法:
流程:1 ,判断传入数据是否正确 2,如果正确则创建一个新的节点,并判断节点是否创建成功 3,然后给节点成员变量赋值 4,最后让新节点变为链表的第一个节点。
代码实现:
// 链表的头插
int Insert_Head(Node** h, LinkData data)
{
//判断传入数据是否正确
if (NULL == h)
{
return FALSE;
}
// 创建新的节点
Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));
if (NULL == node) // 判断节点创建是否成功
{
return FALSE;
}
// 给节点成员变量赋值
node->data = data;
node->next = *h;
// 让新节点变为链表的第一个节点
*h = node;
return TRUE;
}
2、尾插法:
流程:1,首先判断传入数据是否正确 2,如果正确则创建一个新的节点并判断节点是否创建成功 3,然后给成员变量赋值 4,找到最后一个节点(创建一个tmp指向第一个节点,遍历整个链表,最终指向最后一个节点),寻找最后一个节点时要判断是否为空表。
代码:
// 链表的尾插
int Insert_Last(Node** h, LinkData data)
{
if (NULL == h)
{
return FALSE;
}
// 创建新的节点
Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));
if (NULL == node) // 判断节点创建是否成功
{
return FALSE;
}
// 给节点成员变量赋值
node->data = data;
node->next = NULL;
// 找到最后一个节点
Node* tmp = *h; // 指向第一个节点
if (NULL == tmp) // 空表
{
*h = node;
}
else
{
while (tmp->next)
{
tmp = tmp->next;
}
tmp->next = node;
}
return TRUE;
}
3、中间插法(在第pos个节点处插入):
流程:1,判断传入数据是否正确、pos是否符合题意 2,如果正确则创建新节点 3,给变量成员赋值 4,判断是否是空表,如果是空表,则只能插在第一个节点处(需判断pos的值),如果不是空表,需要单独考虑插到第一节点处,然后判断pos是否会越界,找到插入位置的前一个节点(利用第三个指针遍历到pos前一个位置),然后执行插入(插入前要判断遍历后的tmp是否为空)。
代码:
// 在第pos个位置处插入数据
int Insert_Pos (Node** h, int pos, LinkData data)
{
// 判断传入数据是否正确,插入位置是否大于1
if (NULL == h || pos < 1)
{
return FALSE;
}
// 创建新节点
Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));
if (NULL == node)
{
return FALSE;
}
// 给新节点赋值
node->data = data;
// 判断是否为空表,如果是空表则插在第一个节点处
if (NULL == *h)
{
if (1 != pos) // 空表时判断pos是否为1
{
printf ("当前为空表,无法在第%d节点处插入数据\n", pos);
free(node);
return FALSE;
}
node->next = NULL; // 插入第一个节点处
*h = node;
}
// 不为空表时
else
{
if (1 == pos)
{
node->next = *h;
*h = node;
}
else
{
int i;
Node* tmp = *h; // tmp 开始的时候指向第一个节点
for (i = 0; i < pos - 2; i++)
{
if (NULL == tmp) // 如果pos太大会造成越界
{
break;
}
tmp = tmp->next;
}
if (NULL == tmp)
{
printf ("插入位置越界\n");
free(node);
return FALSE;
}
node->next = tmp->next;
tmp->next = node;
}
}
return TRUE;
}
最后附上头文件,宏定义,结构体声明和主函数:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef int LinkData; // 链表的数据类型
typedef struct _node
{
LinkData data; // 链表的数据
struct _node* next; // 指向链表的下一个指针
}Node;
int main()
{
Node* head = NULL; //指向链表第一个结点的指针(头指针)
int i;
for (i = 0; i < 10; i++)
{
Insert_Head(&head, i);
//Insert_Last(&head, i);
//Insert_Pos (&head, pos, i);
}
return 0;
}