【插入结点】--创建链表储存学生的信息,并根据相关信息从某个节点插入另外学生的信息

创建链表存储学生信息,一个结点存储一个学生的信息,包括姓名、年龄、性别、学号。要求手动输入创建链表的长度,然后创建动态链表,并通过键盘给每一个结点赋值,最后将整个链表输出。再根据学生的学号在该学号的结点后插入一个结点,然后再输出插入结点后的整个链表

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct NODE
{
    
    
    char name[20];
    int age ;
    char sex ;
    char num[20] ;
    
    struct NODE * next ;
};

struct NODE * CreateLink(void) ;//函数声明,创建链表
void Init( struct NODE * );//函数声明,链表结点初始化
void OutputLink( struct NODE * ) ; //函数声明,输出链表
void InsertNode( struct NODE *); //函数声明,插入结点

int main ( void )
{
    
    
    char ch = '\0' ;//用于读入Y或y,N或n,做判断
    struct NODE * head = NULL ;/*定义指向空的struct NODE 型结构体变量的头指针*/
    /*---------------------------------创建链表--------------------------------------------*/
    printf("是否创建当前链表(Y/N):");
    while(1)
    {
    
    
        scanf("%c",&ch);
        getchar();//读入输入字母之后按下的回车
        if ( ( 'Y' == ch ) || ( 'y' == ch ) )
        {
    
    
            head = CreateLink();//创建链表
            Init(head) ;
            OutputLink(head);
            
            break ;
        }
        else if ( ( 'N' == ch ) || ( 'n' == ch ) )
        {
    
    
            return 0 ;
        }
        else
        {
    
    
            printf("请重新输入(Y/N):");
        }
    }
    
    /*---------------------------------------插入结点------------------------------------------*/
    printf("是否要插入结点(Y/N):");
    ch = '\0' ;//清空ch之前的值
    while(1)
    {
    
    
        scanf("%c",&ch);
        getchar();
        
        if ( ( 'Y' == ch ) || ( 'y' == ch ) )
        {
    
    
            InsertNode(head);
            OutputLink(head);
            
            break ;
        }
        else if ( ( 'N' == ch ) || ( 'n' == ch ) )
        {
    
    
            break ;
        }
        else
        {
    
    
            printf("请重新输入(Y/N):");
        }
    }
    
    return 0 ;
}

struct NODE * CreateLink(void)
{
    
    
    int i = 0 ; //循环变量
    int cnt = 0 ; //学生的数量,也就是结点数量
    struct NODE * head = malloc( sizeof * head );//定义头指针
    struct NODE * move ;//用来代替头指针进行运算的,因为头指针不能移动
    
    if ( NULL == head )
    {
    
    
        printf("分配失败,程序终止!\n");
        exit(-1);
    }
    
    move = head ;//代替头指针进行移动
    move->next = NULL ;//初始化
    
        printf("请输入学生的数量:");
    scanf("%d",&cnt);//输入结点的数量
    getchar();//读入输入数量之后的回车
    
    
    //创建链表空间地址,但不给结点赋值
    for ( i = 1 ; i <= cnt ; i ++ )//i从1开始,是因为后面输出的时候要用到
    {
    
    
        struct NODE * fresh = malloc ( sizeof * fresh );
        if ( NULL == fresh )
        {
    
    
            printf("分配失败,终止程序!\n");
            exit(-1);
        }
        //结点连接三部曲
        move->next = fresh ;
        fresh->next = NULL ;
        move = fresh ;
    }
    
    return head ;
}

void Init ( struct NODE * head )
{
    
    
    int i = 1 ;
    struct NODE * move = head->next ;
    
    while ( NULL != move )
    {
    
    
        printf("请输入第%d个学生的姓名、年龄、性别、学号:",i);
        scanf("%s%d %c%s", move->name , &move->age , &move->sex , move->num );
        getchar();
        
        move = move->next ;
        
        i ++ ;
    }
    return ;
}

void OutputLink ( struct NODE * head )
{
    
    
    struct NODE * move = head ;
    if ( NULL == move )
    {
    
    
        printf("未创建链表\n");
        return ;
    }
    
    if ( NULL == move->next )
    {
    
    
        printf("链表为空\n");
    }
    
    while ( NULL != move->next )
    {
    
    
        printf("[姓名:%s,年龄:%d,性别:%c,学号:%s]->",move->next->name , move->next->age , move->next->sex , move->next->num );
        move = move->next ;
    }
    
    printf("[^]\n");
}

void InsertNode ( struct NODE * head )
{
    
    
    char num[20] = "\0" ;/*输入一个学号,在这个学号的学生后面插入一个也学生的信息*/
    struct NODE * fresh = malloc ( sizeof * fresh ) ;/*创建要储存要插入的学生的信息的地址*/
    
    printf("请输入你想在那个学号的学生后面再插入一个学生的信息:");
    
    while(1)//解决输入无该学号时的bug
    {
    
    
        struct NODE * move = head->next ;
        
        scanf("%s",num);
        getchar();
        
        while ( NULL != move )
        {
    
    
            if ( 0 == strcmp( num , move->num ) )
            {
    
    
                printf("请输入插入的学生的姓名、年龄、性别、学号:");
                scanf("%s%d %c%s",fresh->name , &(fresh->age) , &(fresh->sex) , fresh->num );
                getchar ();
                //插入结点
                fresh->next = move->next ;
                move->next = fresh ;
                
                return ;//插入后就退出程序
            }
            
            move = move->next ;
        }
        
        printf("无该结点,请重新输入:");
    }
}



是否创建当前链表(Y/N):y
请输入学生的数量:3
请输入第1个学生的姓名、年龄、性别、学号:欧阳丽 24 F Z1207031
请输入第2个学生的姓名、年龄、性别、学号:陈商清 22 F Z1207035
请输入第3个学生的姓名、年龄、性别、学号:陈迎接 26 F Z1207024
[姓名:欧阳丽,年龄:24,性别:F,学号:Z1207031]->[姓名:陈商清,年龄:22,性别:F,学号:Z1207035]->[姓名:陈迎接,年龄:26,性别:F,学号:Z1207024]->[^]
是否要插入结点(Y/N):y请输入你想在那个学号的学生后面再插入一个学生的信息:Z1207035
请输入插入的学生的姓名、年龄、性别、学号:周琴琴 25 F Z1207041
[姓名:欧阳丽,年龄:24,性别:F,学号:Z1207031]->[姓名:陈商清,年龄:22,性别:F,学号:Z1207035]->[姓名:周琴琴,年龄:25,性别:F,学号:Z1207041]->[姓名:陈迎接,年龄:26,性别:F,学号:Z1207024]->[^]

猜你喜欢

转载自blog.csdn.net/m0_74282485/article/details/128536227