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