#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include <string>
using std::string;//strcmp需要加这三行代码,因为标准库中没有
#include<malloc.h>typedef struct
{
char id[16];
char name[20];
double score;
} Student;
typedef struct LNode
{
Student data;
struct LNode* next;//struct不能套用自身,但是指针就可以
} LNode, * LinkList;
//为了方便,我比较喜欢在主函数中初始化
//LinkList InList(LinkList L)对整个结构体赋值,一个指针权限不够,要用多一个指针
//{
// L = (LinkList)malloc(sizeof(LNode));//创建一个头,从内存中查找出LNode大小的内存用malloc函数创建并转化成LinkList类型
// L->next = NULL;
// return L;
//}
void CreatList_H(LinkList L)
{
LNode* newNode;
int i, n;
printf("你要添加多少个?");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
newNode = (LNode*)malloc(sizeof(LNode));
printf("请输入你要添加的学号:");
scanf("%s", &newNode->data.id);
printf("请输入你要添加的姓名:");
scanf("%s", &newNode->data.name);
printf("请输入你要添加的分数:");
scanf("%lf", &newNode->data.score);
newNode->next = L->next;
L->next = newNode;
}
}
void PrintLinklist(LinkList L)
{
LNode* p;
p = L->next;
int j=0,i=0;
if (p == NULL) {
printf("没有学生");
return;
}
while(p != NULL)
{
printf("学号-------------姓名-----------------分数-----------------\n");
printf("%-16s %-20s %-20.2lf \n", p->data.id, p->data.name, p->data.score);
p = p->next;
}
}
void SearchStudent(LinkList L)
{
LNode* p;
int i;
char x[20];
p = L->next;
printf("你要查找的学生学号是什么:");
scanf("%s", &x);
while (p != NULL)
{
if (strcmp(x,p->data.id)==0) {
printf("学号%s\n", p->data.id);
printf("姓名%s\n", p->data.name);
printf("分数%lf\n", p->data.score);
return;
}
p = p->next;
}
printf("没有找到\n");
}
void DelStudent(LinkList L)
{
LNode* p,*q;
int i;
char x[20];
p = L;
q = p->next;
printf("你要删除的学生学号是什么");
scanf("%s", &x);
while (q)
{
if (strcmp(x, q->data.id) == 0) {
p->next = q->next;
printf("删除成功\n");
return;
}
p = p->next;
q = q->next;
}
printf("失败\n");
}
/*
void InsertStudent(LinkList L){
LNode* p, *q,*new;
p = L;
q = p->next;
char x[20];
int y;
new = (LNode*)malloc(sizeof(LNode));
printf("你想插在谁的学号前面?");
scanf("%s", &x);
while (q!=NULL)
{
if (strcmp(x, q->data.id) == 0) {
printf("你想插入的学号是什么?");
scanf("%s", &new->data.id);
printf("你想插入的姓名是什么?");
scanf("%s", &new->data.name);
printf("你想插入的分数是什么?");
scanf("%lf", &new->data.score);
new->next = q;
p->next = new;
printf("插入成功\n");
return;
}
p = p->next;
q = q->next;
}
printf("不存在这个学生");
}
*/
void ReviseStudent(LinkList L) {
LNode* p;
char x[20];
p = L->next;
printf("你想修改的学生学号是什么?");
scanf("%s", &x);
while (p != NULL)
{
if (strcmp(x, p->data.id) == 0) {
printf("新修改后的学号是?");
scanf("%s", &p->data.id);
printf("新修改后的姓名是?");
scanf("%s", &p->data.name);
printf("新修改后的分数是?");
scanf("%lf", &p->data.score);
printf("修改成功成功\n");
return;
}
p = p->next;
}
printf("不存在这个学生");
}
void ClearStudent(LinkList L) {
L->next = NULL;
printf("清空成功");
}
void CreatList_E(LinkList L) {
LNode* newNode,*p;
int i, n;
printf("你要添加多少个?");
scanf("%d", &n);
p = L;
while (p->next!=NULL)
{
p = p->next;
}
for (i = 0; i < n; i++)
{
newNode = (LNode*)malloc(sizeof(LNode));
printf("请输入你要添加的学号:");
scanf("%s", &newNode->data.id);
printf("请输入你要添加的姓名:");
scanf("%s", &newNode->data.name);
printf("请输入你要添加的分数:");
scanf("%lf", &newNode->data.score);
newNode->next = NULL;
p->next = newNode;
p = newNode;
}
}
int main()
{
LinkList L;
L = (LinkList)malloc(sizeof(LNode));//创建一个头,从内存中查找出LNode大小的内存用malloc函数创建并转化成LinkList类型
L->next = NULL;//直接在主函数初始化省去二级指针的麻烦
int input;
do
{
printf("\n\n\n\n");
printf("\t\t|-------------------------------------------------------------|\n");
printf("\t\t| |\n");
printf("\t\t| ====================== |\n");
printf("\t\t| 欢迎使用学生管理系统 |\n");
printf("\t\t| Welcome to the student management system |\n");
printf("\t\t| ====================== |\n");
printf("\t\t| |\n");
printf("\t\t| 0.头插学生 |\n");
printf("\t\t| 1.尾插学生 |\n");
printf("\t\t| 2.查找学生 |\n");
printf("\t\t| 3.删除学生 |\n");
printf("\t\t| 4.修改学生 |\n");
printf("\t\t| 5.插入学生 |\n");
printf("\t\t| 6.清空全部学生 |\n");
printf("\t\t| 7.查看全部学生 |\n");
printf("\t\t| 8.退出系统 |\n");
printf("\t\t|-------------------------------------------------------------|\n");
printf("\n\t\t请输入您的选择:");
scanf("%d", &input);
switch (input)
{
case 0:
CreatList_H(L);//CreatList_H(L);//L已经是指针,所以要用一级指针在函数接受,如果L加&,相当于二级指针
break;
case 1:
CreatList_E(L);
break;
case 2:
SearchStudent(L);
break;
case 3:
DelStudent(L);
break;
case 4:
ReviseStudent(L);
break;
//case 5:
// InsertStudent(L);
//break;
case 6:
ClearStudent(L);
break;
case 7:
PrintLinklist(L);
break;
case 8:
printf("退出成功");
break;
default:
printf("选择有误,请重新选择");
break;
}
} while (input != 8);
return 0;
}