#include
#include
#include
#include
#include
# define Esc 27
# define LEN sizeof(struct student)
struct student{
int num;
int score;
struct student *next;
};
int n = 0;//全局变量,记录学生记录数
//函数声明
struct student *create();
struct student *insert(struct student *head);
void bubblesort(struct student *head);
void insert_sort(struct student *head);
void GetPoint(struct student *head,int i);
void change(struct student *list);
void del(struct student *list);
int GetElem(struct student *head,int i);
void bin_search(struct student *head);
void menu();
void goon();
//系统主界面
void menu()
{
printf("\n\n\t\t\t &欢迎使用学生成绩管理系统& ");
printf("\n\n\t\t 1.新建学生信息表 ");
printf("\n\n\t\t 2.冒泡排序(学号)输出学生信息 ");
printf("\n\n\t\t 3.插入排序(成绩)输出学生信息 ");
printf("\n\n\t\t 4.折半法查询学号并显示对应成绩信息");
printf("\n\n\t\t 5.删除学生信息 ");
printf("\n\n\t\t 6.修改学生信息 ");
printf("\n\n\t\t 7.添加学生信息 ");
printf("\n\n\t\t ESC.退出系统 ");
printf("\n\n\t\t ---------------------------------------------");
printf("\n\t\t\t\t请输入您的选择项(1-7):");
}
//创建链表
struct student *create()
{
struct student *head,*node,*end;
head = (struct student*)malloc(LEN);
end = head;
int i,number;
printf("\t请输入要创建的学生信息个数:");
scanf("%d",&number);
for(i=0;i<number;i++){
node=(struct student*)malloc(LEN);
printf("\t请输入学号:");
scanf("%d",&node->num);
printf("\t请输入英语成绩:");
scanf("%d",&node->score);
end->next=node;
end=node;
n++;
}
end->next=NULL;
return head;
};
//删除学生信息
void del(struct student *head){
int s,i=0;
printf("\t删除第几个学生的信息:");
scanf("%d",&s);
struct student *t=head,*in;
while (i<s&&t!=NULL){
in=t;
t=t->next;
i++;
}
if(t!=NULL){
n--;
in->next=t->next;
free(t);
}
else{
printf("节点不存在");
}
}
//修改学生信息
void change(struct student *head){
int s,i=0;
printf("\t修改第几个学生的信息:");
scanf("%d",&s);
struct student *t=head;
while(i<s&&t!=NULL){
t=t->next;
i++;
}
if(t != NULL){
printf("\t请输入修改学号:");
scanf("%d",&t->num);
printf("\t请输入修改英语成绩:");
scanf("%d",&t->score);
}else{
printf("节点不存在");
}
}
//插入学生信息
struct student *insert(struct student *head)
{
struct student *t=head,*in;
int i=0;
while(i<n&&t!=NULL){
t=t->next;
i++;
}
if(t!=NULL){
in=(struct student*)malloc(LEN);
printf("\t请输入学号:");
scanf("%d",&in->num);
printf("\t请输入英语成绩:");
scanf("%d",&in->score);
n++;
in->next=t->next;
t->next=in;
}else{
printf("节点不存在");
}
return head;
};
//冒泡排序学生信息
void bubblesort(struct student *head)
{
int count = n;//用来控制次数
struct student *pMove;
pMove = head->next;
while (count > 1) {
while (pMove->next != NULL) {
if (pMove->num > pMove->next->num) {
int temp1,temp2;
temp1 = pMove->num;
pMove->num = pMove->next->num;
pMove->next->num = temp1;
temp2 = pMove->score;
pMove->score = pMove->next->score;
pMove->next->score = temp2;
}
pMove = pMove->next;
}
count--;
//重新移动到第一个节点
pMove = head->next;
}
};
//插入排序学生信息
void insert_sort(struct student *head){
struct student *newhead, *pre, *l1, *l2;
l1=head->next;
newhead=l1->next;
l1->next=NULL;
while(newhead)
{
l2=newhead;
newhead=newhead->next;
pre=head;
l1=head->next;
while(l1!=NULL&&l1->score<l2->score)
{
pre=l1;
l1=l1->next;
}
l2->next=l1;
pre->next=l2;
}
};
//取得链表第i个元素
int GetElem(struct student *head,int i){
int j=0;
struct student *p;
p = head;
while(p&&j<i){
p = p->next;
j++;
}
return p->num;
}
//输出第i个元素数据
void GetPoint(struct student *head,int i){
int j=0;
struct student *p;
p = head;
while(p&&j<i){
p = p->next;
j++;
}
printf("\n学号\t英语成绩\n");
printf("%d",p->num );
printf("\t%d\n",p->score );
}
//折半查找学生信息
void bin_search(struct student *head){
int low=1,high=n,mid=0,key;
printf("\t请输入要查找学生信息的学号:");
scanf("%d",&key);
while(low<=high){
mid=(low+high)/2;
if(key==GetElem(head,mid))
{
GetPoint(head,mid);
break;
}
else if(key<GetElem(head,mid))
high=mid-1;
else
low=mid+1;
}
}
//输出链表
void Output(struct student *head)
{
struct student *p;
p=head->next;
printf("\n\n\n****************学生成绩信息表****************\n\n");
printf("\n\t现在有%d个记录是:\n",n);
printf("\n学号\t英语成绩\n");
if(p!=NULL)
{
do
{
printf("%d",p->num );
printf("\t%d\n",p->score );
p=p->next;
} while(p!=NULL);
}
}
void goon()
{
printf("按任意键继续!!!");
getch();
}
//主程序
int main(){
struct student *head;
char ckey='a';
int istate=0;//记录链表是否有数据
do
{
system("cls");
menu();
ckey=getch();
if(ckey=='1')
{
if(head!=NULL){
head=NULL;
n=0;
}
system("cls");
head=create();
Output(head);
istate=1;
goon();
}
else if((istate==0)&&(ckey!=Esc))
{
printf("\n\t错误:你必须先输入学生信息!!!");
goon();
}
else if(ckey=='2')
{
system("cls");
bubblesort(head);
Output(head);
goon();
}
else if(ckey=='3')
{
system("cls");
insert_sort(head);
Output(head);
goon();
}
else if(ckey=='4')
{
system("cls");
bubblesort(head);
bin_search(head);
//Output(head);
goon();
}
else if(ckey=='5')
{
system("cls");
del(head);
Output(head);
goon();
}
else if(ckey=='6')
{
system("cls");
change(head);
bubblesort(head);
Output(head);
goon();
}
else if(ckey=='7')
{
system("cls");
insert(head);
bubblesort(head);
Output(head);
goon();
}
}while(ckey!=Esc);
exit(0);
}
参考文章:
c语言链表详解(超详细)
C语言链表学生信息管理系统
折半查找(C语言链表实现)