数据结构C语言实现----向链表中插入结点

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

  

运行结果:

 

posted @ 2020-07-13 17:02  骑码的佳俊  阅读(1645)  评论(0编辑  收藏  举报