有10个学生,每个学生的数据包括学号、姓名、性别和1门课成绩,编写如下函数:
①根据学生的信息建立链表;
②输出链表;
③输入一个学生的学号,查找链表中是否有该学生;
④在第i个学生前插入一个学生信息;
①根据学生的信息建立链表;
②输出链表;
③输入一个学生的学号,查找链表中是否有该学生;
④在第i个学生前插入一个学生信息;
⑤删除链表中第i个学生。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student{
int num;
char name[20];
char sex;
int score;
struct student *next;
}Student;
Student *build(Student *head)
{
Student *cur,*temp;
int i,n;
printf("输入几个学生信息:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
temp=(Student *)malloc(sizeof(Student));
if(temp)
{
printf("请输入学号:");
scanf("%d",&temp->num);
printf("请输入姓名:");
getchar();
gets(temp->name);
printf("请输入性别:");
//getchar();
scanf("%c",&temp->sex);
printf("请输入成绩:");
scanf("%d",&temp->score);
temp->next=NULL;
if(i==0)
head=cur=temp;
else
{
cur->next=temp;
cur=cur->next;
}
}
}
return head;
}
void show(Student *head)
{
Student *cur;
cur=head;
while(cur!=NULL)
{
printf("%5d\t",cur->num);
printf("%10s\t",cur->name);
printf("%5c\t",cur->sex);
printf("%5d\n",cur->score);
cur=cur->next;
}
}
void seeknum(Student *head)
{
Student *cur;
cur=head;
int num;
printf("请输入要查找的学号:");
scanf("%d",&num);
while(cur!=NULL)
{
if(cur->num==num)
break;
cur=cur->next;
}
if(cur!=NULL)
{
printf("%5d\t",cur->num);
printf("%10s\t",cur->name);
printf("%5c\t",cur->sex);
printf("%5d\n",cur->score);
}
else
printf("未查到该同学信息.\n");
}
void seekname(Student *head)
{
char name[20];
Student *cur;
cur=head;
printf("请输入要查找的学生姓名:");
scanf("%s",name);
while(cur!=NULL)
{
if(strcmp(cur->name,name)==0)
break;
cur=cur->next;
}
if(cur!=NULL)
{
printf("%5d\t",cur->num);
printf("%10s\t",cur->name);
printf("%5c\t",cur->sex);
printf("%5d\n",cur->score);
}
else
printf("未查到该同学信息.\n");
}
void seek(Student *head)
{
int n;
while(1)
{
printf("================\n");
printf("1. 按学号查找\n");
printf("2. 按姓名查找\n");
printf("3. 结束查找\n");
scanf("%d",&n);
switch(n)
{
case 1:{
seeknum(head);
break;
}
case 2:{
seekname(head);
break;
}
case 3:return;
}
}
}
void insert(Student *head)
{
int i;
int n;
Student *cur,*temp;
cur=head;
printf("请输入插入到第几个同学前面:");
scanf("%d",&n);
temp=(Student *)malloc(sizeof(Student));
if(temp)
{
printf("请输入学号:");
scanf("%d",&temp->num);
printf("请输入姓名:");
getchar();
gets(temp->name);
printf("请输入性别:");
//getchar();
scanf("%c",&temp->sex);
printf("请输入成绩:");
scanf("%d",&temp->score);
temp->next=NULL;
}
if(n==1)
{
temp->next=head;
head=temp;
}
else
{
for(i=0;i<n-2;i++)
cur=cur->next;
temp->next=cur->next;
cur->next=temp;
}
}
void del(Student *head)
{
Student *cur,*temp;
int i;
int n;
cur=head;
printf("请输入要删除第几个学生:");
scanf("%d",&n);
for(i=0;i<n-2;i++)
cur=cur->next;
if(n==0)
{
temp=head;
head=head->next;
}
else
{
temp=cur->next;
cur->next=temp->next;
}
free(temp);
}
int main()
{
int n;
Student *head=NULL;
while(1)
{
printf("\t===================\n");
printf("\t1. 建立链表\n");
printf("\t2. 显示\n");
printf("\t3. 查找\n");
printf("\t4. 插入\n");
printf("\t5. 删除\n");
printf("\t6. 退出\n");
scanf("%d",&n);
switch(n)
{
case 1:head=build(head);break;
case 2:show(head);break;
case 3:seek(head);break;
case 4:insert(head);break;
case 5:del(head);break;
case 6:return 0;
}
}
return 0;
}