#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
int no;//学号
char name[10];//姓名
int score;//成绩
}student;
typedef struct node{
student stu;//学生
struct node * next;//后继指针
}LinkList;//单链表结点结构,每个结点包括学生及后继
LinkList *inputdata(){ //输入一个学生的信息
LinkList *s=NULL;
int no;
char name[10];
int score;
s = (LinkList *)malloc(sizeof(LinkList));
printf("\n");
printf("请输入学号(不超过4位):");
scanf("%d",s->stu.no);
if(no==-1)
return s;
printf("请输入姓名(不超过4个汉字):");
scanf("%s",s->stu.name);
printf("请输入成绩(整数):");
scanf("%d",&s->stu.score);
return s;
}
void printElem(LinkList *p) //显示一个学生的信息
{
printf("\n\n\nno\t\tname\t\tscore:");
printf("\n%d",p->stu.no);
printf("\t\t");
printf("%s",p->stu.name);
printf("\t\t");
printf("%-4d\n",p->stu.score);
}
void printElemALL(LinkList *L) //显示全部学生的信息
{
LinkList *p;
p=L->next;
printf("\n\n\nno\t\tname\t\tscore:");
while(p)
{
printf("\n%d",p->stu.no);
printf("\t\t");
printf("%s",p->stu.name);
printf("\t\t");
printf("%-4d\n",p->stu.score);
p=p->next;
}
}
LinkList* createList(){ //尾插法创建带头结点单链表
LinkList *L,*s,*r;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
printf("请输入学生信息,当学号no为-1时结束;\n\n");
while(1){
s=inputdata();
if(!s) break;
r->next=s;
r=s;
}
r->next=NULL;
printElemALL(L);
return L;
}
void locateElem(LinkList *L, int ch) //按学号查找学生
{
int no;
LinkList *p=L->next;
while(p&&(no==ch))
p=p->next;
if(!p) printf("\n\n\tDon't find the student!\n");
else printElem(p);
}
void insertElem(LinkList *L,int ch) //在带头结点的单链表中指定学号前插入学生
{
int no;
LinkList *s,*p;
p=L;
while((p->next)&&(no==ch))
p=p->next;
s=inputdata();
s->next=p->next;
p->next=s;
}
void deleteElem(LinkList *L,int ch) //删除给定学号的学生信息
{
int no;
LinkList*p,*q;
p=L;
while ((p->next)&&(no==ch))
{
p=p->next;
}
if(!p->next)
{
printf("\n\n\tDon't find the student!\n");
}
else
{
q=p->next;
printf("\n\ndeletd student's information:");
printElem(q);
p->next=q->next;
free(q);
printf("\n\nall student's information:");
printElemALL(L);
}
}
void main(){
printf("%s","20211齐可钰\n\n");
LinkList *L;
int ch;
char name[10];
int a,b=1;
printf("=========================================================\n\n");
printf(" 单链表结构的学生成绩管理系统\n\n");
printf("=========================================================\n\n");
while(b)
{
printf("\n\n");
printf("<1>创建 <2>指定学号前插入 <3>按学号删除\n");
printf("<4>按学号查找 <5>显示所有学生 <6>退出\n");
printf("\n请输入功能选项:");
scanf("%d",&a);
switch (a)
{
case 1:L=createList();
break;
case 2:printf("\n输入待插入数据在哪个学号前:");
scanf("%d",ch);
insertElem(L,ch);
break;
case 3: printf("\n输入待删除学生的学号:");
scanf("%d",ch);
deleteElem(L,ch);
break;
case 4:printf("\n输入待查找学生的学号:");
scanf("%d",ch);
locateElem(L,ch);
break;
case 5:printElemALL(L);
break;
case 6:printf("\n已退出\n");
b=0;
break;
}
}
}
两个判断条件有问题,其他还没看出来
LinkList *inputdata(){ //输入一个学生的信息
LinkList *s=NULL;
//int no;
char name[10];
int score;
s = (LinkList *)malloc(sizeof(LinkList));
printf("\n");
printf("请输入学号(不超过4位):");
scanf("%d",s->stu.no);
if(s->stu.no==-1)
return s;
printf("请输入姓名(不超过4个汉字):");
scanf("%s",s->stu.name);
printf("请输入成绩(整数):");
scanf("%d",&s->stu.score);
return s;
}
LinkList* createList(){ //尾插法创建带头结点单链表
LinkList *L,*s,*r;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
printf("请输入学生信息,当学号no为-1时结束;\n\n");
while(1){
s=inputdata();
if(s->stu.no==-1) break;
r->next=s;
r=s;
}
r->next=NULL;
printElemALL(L);
return L;
}