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)
{// 判断传入数据是否正确,插入位置是否大于1if (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 0typedef 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;
}