#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student{
char id[20];
char name[25];
char sex[5];
int age;
float mark;
struct student *next;
}STU;
int stu_con = 0;
STU *P = NULL;
STU *TEMP = NULL;
STU * Creat_Head(void);//创建头节点
int menu(void);//菜单
STU * Creat_New(void);//创建新节点
void stu_add(STU * head);//添加
void stu_del(STU * head);//删除
int del_stu(STU * head, char *q, int flag);//删除子函数
void stu_alt(STU * head);//修改
void stu_ins(STU * head);//插入
void stu_rank(STU * head);//排序
void stu_seek(STU * head);//查询
void stu_look(STU * head);//查看全部
void stu_arr(STU * head);//排除重复
int main()
{
int ret = 0;
STU * stu_head = NULL;
stu_head = Creat_Head();
while(1)
{
ret = menu();
switch(ret)
{
case 1:stu_add(stu_head);
break;
case 2:stu_del(stu_head);
break;
case 3:stu_alt(stu_head);
break;
case 4:stu_seek(stu_head);
break;
case 5:stu_ins(stu_head);
break;
case 6:stu_rank(stu_head);
break;
case 7:stu_look(stu_head);
break;
case 8:stu_arr(stu_head);
break;
default:return 0;
break;
}
}
return 0;
}
//创建头节点
STU * Creat_Head(void)
{
STU * head = NULL;
head = (STU*)malloc(sizeof(STU));
if(head == NULL)
{
return NULL;
}
strcpy(head->id,"\0");
strcpy(head->name,"\0");
strcpy(head->sex,"\0");
head->age = 0;
head->mark = 0;
head->next = NULL;
return head;
}
//菜单
int menu(void)
{
int n;
printf("********1.添加**********\n");
printf("********2.删除**********\n");
printf("********3.修改**********\n");
printf("********4.查询**********\n");
printf("********5.插入**********\n");
printf("********6.排序**********\n");
printf("********7.查看全部******\n");
printf("********8.学号排重******\n");
printf("********0.退出**********\n");
printf("请输入:");
scanf("%d", &n);
return n;
}
//添加
void stu_add(STU * head)
{
STU *p = head;
STU *stu_new = Creat_New();
while(p->next != NULL)
{
p = p->next;
}
p->next = stu_new;
printf("请输入学号:");
scanf("%s", stu_new->id);
printf("请输入姓名:");
scanf("%s", stu_new->name);
printf("请输入性别:");
scanf("%s", stu_new->sex);
printf("请输入年龄:");
scanf("%d", &(stu_new->age));
printf("请输入成绩:");
scanf("%f", &(stu_new->mark));
printf("添加成功\n");
stu_con++;
}
//创建新节点
STU * Creat_New(void)
{
STU * stu_new = NULL;
stu_new = (STU*)malloc(sizeof(STU));
if(stu_new == NULL)
{
return NULL;
}
strcpy(stu_new->id,"\0");
strcpy(stu_new->name,"\0");
strcpy(stu_new->sex,"\0");
stu_new->age = 0;
stu_new->mark = 0;
stu_new->next = NULL;
return stu_new;
}
//查看全部
void stu_look(STU * head)
{
STU *p = head->next;
printf("学号\t姓名\t性别\t年龄\t成绩\n");
while(p != NULL)
{
printf("%-8s%-10s%-9s%-8d%.2f\n", p->id, p->name, p->sex, p->age, p->mark);
p = p->next;
}
}
//删除
void stu_del(STU * head)
{
int i, flag = 0, num = 0, n;
STU *p = head->next;
STU *temp = NULL;
char id[20] = "\0";
char *q = id;
printf("输入需要删除的学生学号:");
scanf("%s", id);
while(p != NULL)
{
for(i = 0;i < strlen(id);i++)
{
if(id[i] != p->id[i])
{
flag = 1;
break;
}
}
if(flag == 0)
{
num++;
}
p = p->next;
flag = 0;
}
switch(num)
{
case 0:printf("无此学号\n");
break;
case 1:del_stu(head, q, 0);
break;
default:
{
printf("学号\t姓名\t性别\t年龄\t成绩\n");
p = head->next;
while(p != NULL)
{
for(i = 0;i < strlen(id);i++)
{
if(id[i] != p->id[i])
{
flag = 1;
break;
}
}
if(flag == 0)
{
printf("%-8s%-8s\t%-8s%-8d%.2f\n", p->id, p->name, p->sex, p->age, p->mark);
}
p = p->next;
flag = 0;
}
printf("1.全部删除\t0.选择删除\n");
scanf("%d", &n);
del_stu(head, q, n);
}
break;
}
}
//删除子函数
int del_stu(STU * head, char *q, int flag)
{
int flag_id = 0, i;
STU *p = head;
STU *temp = NULL;
while(p->next != NULL)
{
for(i = 0;i < strlen(q);i++)
{
if(*(q + i) != p->next->id[i])
{
flag_id = 1;
break;
}
}
if(flag_id == 0)
{
temp = p->next;
p->next = p->next->next;
free(temp);
temp = NULL;
stu_con--;
if(flag == 0)
{
printf("删除成功\n");
return 0;
}
}
else
{
flag_id = 0;
p = p->next;
}
}
printf("删除成功\n");
}
//修改
void stu_alt(STU * head)
{
char id[20] = "\0", str[10] = "\0";
STU *p = head->next;
printf("输入需要修改的学生学号:");
scanf("%s", id);
while(p != NULL)
{
if(strcmp(id,p->id) == 0)
{
printf("输入需要修改的项:");
scanf("%s", str);
if(!strcmp(str,"学号"))
{
printf("输入修改后的内容:");
{
scanf("%s", p->id);
}
}
if(!strcmp(str,"姓名"))
{
printf("输入修改后的内容:");
{
scanf("%s", p->name);
}
}
if(!strcmp(str,"性别"))
{
printf("输入修改后的内容:");
{
scanf("%s", p->sex);
}
}
if(!strcmp(str,"年龄"))
{
printf("输入修改后的内容:");
{
scanf("%d", &(p->age));
}
}
if(!strcmp(str,"成绩"))
{
printf("输入修改后的内容:");
{
scanf("%f", &(p->mark));
}
}
printf("修改成功\n");
break;
}
p = p->next;
}
}
//插入
void stu_ins(STU * head)
{
int val;
char id[20] = "\0", str[10] = "\0";
STU *p = head;
STU *stu_new = Creat_New();
printf("输入需要插入位置的学号:");
scanf("%s", id);
while(p->next != NULL)
{
if(strcmp(p->next->id,id) == 0)
{
printf("1.插入%s之前\t2.插入%s之后\n", id, id);
scanf("%d", &val);
if(val == 1)
{
stu_new->next = p->next;
p->next = stu_new;
p1: printf("请输入学号:");
scanf("%s", stu_new->id);
printf("请输入姓名:");
scanf("%s", stu_new->name);
printf("请输入性别:");
scanf("%s", stu_new->sex);
printf("请输入年龄:");
scanf("%d", &(stu_new->age));
printf("请输入成绩:");
scanf("%f", &(stu_new->mark));
printf("插入成功\n");
stu_con++;
break;
}
else
{
stu_new->next = p->next->next;
p->next->next = stu_new;
goto p1;
}
}
p = p->next;
}
}
//排序
void stu_rank(STU * head)
{
int i, j, val;
STU *p = head;
STU *p1 = NULL;
STU *p2 = NULL;
printf("1.按成绩排序\t2.按学号排序\n");
scanf("%d", &val);
switch(val)
{
case 1:
{
for(i = 1;i < stu_con;i++)
{
for(j = 0;j < stu_con - i;j++)
{
if(p->next->mark < p->next->next->mark)
{
p1 = p->next;
p->next = p->next->next;
p2 = p->next->next;
p->next->next = p1;
p1->next = p2;
}
p = p->next;
}
p = head;
}
}
break;
case 2:
{
for(i = 1;i < stu_con;i++)
{
for(j = 0;j < stu_con - i;j++)
{
if(strcmp(p->next->id,p->next->next->id) > 0)
{
p1 = p->next;
p->next = p->next->next;
p2 = p->next->next;
p->next->next = p1;
p1->next = p2;
}
p = p->next;
}
p = head;
}
}
break;
}
}
//查询
void stu_seek(STU * head)
{
int i, flag = 0;
STU *p = head->next;
char id[20] = "\0";
printf("输入需要查询的学生学号:");
scanf("%s", id);
printf("学号\t姓名\t性别\t年龄\t成绩\n");
while(p != NULL)
{
for(i = 0;i < strlen(id);i++)
{
if(id[i] != p->id[i])
{
flag = 1;
break;
}
}
if(flag == 0)
{
printf("%-8s%-8s\t%-8s%-8d%.2f\n", p->id, p->name, p->sex, p->age, p->mark);
}
p = p->next;
flag = 0;
}
}
//排除重复
void stu_arr(STU * head)
{
P = head->next;
while(P->next != NULL)
{
if(strcmp(head->next->id, P->next->id) == 0)
{
TEMP = P->next;
P->next = P->next->next;
free(TEMP);
TEMP = NULL;
stu_con--;
}
else
{
P = P->next;
}
}
P = NULL;
if(head->next->next != NULL)
{
stu_arr(head->next);
}
else
{
return;
}
}