1.明确在第几个结点后插入
2.找到插入位置的前一个结点
3.交换指针:设插入位置的前一个结点为结点A , 插入的结点为结点B , 插入结点后面的一个节点为结点C
(1)结点B指向结点C
(2)结点A指向结点B
代码如下:
#include<stdio.h> #include<stdlib.h> typedef struct Node { char date; struct Node *next; }Node , *LinkList; //////////////////////////////// //创建一个链表 LinkList creatlinklist(int n) { LinkList New_node , Tail_node; LinkList Head_node=NULL; char c; for (size_t i = 0; i < n; i++) { printf("第%d个结点的数据为:",i+1); scanf("%c",&c); fflush(stdin); New_node = (LinkList)malloc(sizeof(Node)); New_node->date = c; New_node->next = NULL; if (Head_node ==NULL) { Head_node = New_node; }else { Tail_node->next = New_node; } Tail_node = New_node; } return Head_node; } ////////////////////////////// //向链表中插入结点 void insertlist(LinkList *List , int m , char insert_date) {//在链表List中,在第m个结点之后插入insert_date LinkList insert_node;//创建一个要插入的结点 insert_node = (LinkList)malloc( sizeof(Node) );//为这个节点申请空间 insert_node->date = insert_date;//把要插入的数据放入到这个结点中 if (*List == NULL) {//如果这个链表为空链表,则直接插入到第一个节点 *List = insert_node; insert_node->next = NULL; }else { LinkList befor_node = *List;//找到要插入位置的前一个结点 for (size_t i = 1; i < m; i++) { befor_node = befor_node->next; } insert_node->next = befor_node->next;//插入节点指向第三个结点(即前一个结点本来指向的结点) befor_node->next = insert_node;//前一个结点指向插入结点 } } int main() { int n; char c; LinkList List , List2; //List用于第一次打印单链表,List2用于第二次打印单链表 printf("请输入结点个数:"); scanf("%d",&n); fflush(stdin); List = creatlinklist(n); List2 = List;//复制一遍链表,第一次打印链表后链表后头指针会直接指向NULL,导致第二次打印失败 printf("打印单链表:"); while ( List != NULL ) { printf("%c" , List->date); List = List->next; } putchar('\n'); /////////////////////////////// //插入结点 printf("在第几个结点后面插入字符:"); scanf("%d",&n); fflush(stdin); printf("插入的字符为:"); scanf("%c",&c); fflush(stdin); insertlist(&List2 , n , c); printf("打印单链表:"); while ( List2 != NULL ) { printf("%c" , List2->date); List2 = List2->next; } return 0; }
运行结果: