#include
#include
typedef struct NODE
{
int ID;
char name[100];
int score[3];
struct NODE *next;
}LNODE,*LINKLIST;
void InitList(LINKLIST *L);
LNODE * CreatNode();
void PriList(LNODE *head);
LNODE * InsertNode(LNODE *head,int n);
LNODE * DelNode(LNODE *head,int n);
LNODE * FindNode(LNODE *head,int ID);
LNODE * SortNode(LNODE *head);
int MenuSelect();
int main(void)
{
LNODE *head;
int m;
int ID;
int choice;
InitList(&head);
while((choice=MenuSelect())!='9')
{
switch(choice)
{
case 1:
head=CreatNode();
break;
case 2:
PriList(head);
break;
case 3:
printf("输入你要查找的节点:");
scanf("%d",&ID);
putchar('\n');
FindNode(head,ID);
break;
case 4:
printf("输入你要删除的节点:");
scanf("%d",&m);
putchar('\n');
head=DelNode(head,m);
break;
case 5:
head=SortNode(head);
break;
case 6:
printf("输入你要插入的节点:");
scanf("%d",&m);
putchar('\n');
InsertNode(head,m);
break;
case 7:
break;
case 8:
break;
case 9:
exit(0);
break;
}
}
}
int MenuSelect()
{
int n;
printf("*************************欢迎使用学生管理系统***********************************\n");
printf("********************************MENU*********************************************\n");
printf("\t\t\t1. 输入学生成绩记录 Enter the record\n"); /*输入学生成绩记录*/
printf("\t\t\t2. 显示 Print the record\n"); /*显示*/
printf("\t\t\t3. 寻找 Search record on name\n"); /*寻找*/
printf("\t\t\t4. 删除 Delete a record\n"); /*删除*/
printf("\t\t\t5. 排序 Sort to make new a file\n"); /*排序*/
printf("\t\t\t6. 插入 Insert record to list\n"); /*插入*/
printf("\t\t\t7. 保存 Save the file\n"); /*保存*/
printf("\t\t\t8. 读取 Load the file\n"); /*读取*/
printf("\t\t\t9. 退出 Quit\n"); /*退出*/
printf("\n*********************Made by He Guo Ping.*************************************\n");
do{
printf("\n请输入你的选择Enter your choice(1~9):");
scanf("%d",&n);
}while(n<1||n>9); /*如果选择项不在1~9之间则重输*/
return(n); /*返回选择项,主函数根据该数调用相应的函数*/
}
LNODE * CreatNode()
{
int i;
LNODE *p;
LNODE *head=NULL;
while(1)
{
p=(LNODE *)malloc(sizeof(LNODE));
printf("输入学号Enter the num(0:list end):");
scanf("%d",&p->ID);
if(p->ID==0)
break; /*如果学号首字符为0则结束输入*/
printf("输入学生姓名:");
scanf("%s",&(p->name));
for(i=0;i<3;i++)
{
printf("输入第%d门课程成绩:",i+1);
scanf("%d",&(p->score[i]));
}
// if(head=NULL)
// head=p;
p->next=head;
head=p;
}
return head;
}
void InitList(LINKLIST *L)
{
(*L)=(LNODE *)malloc(sizeof(LNODE));
(*L)->next=NULL;
}
void PriList(LNODE *head)
{
LNODE *p;
int pos=1;
p=head;
while(p!= NULL)
{
printf("************************************************************\n");
printf("| ID | NAME | ENGLISH | SHUXUE | YUWEN |\n");
printf("| %d | %s | %d | %d | %d |\n",p->ID,p->name,p->score[0],p->score[1],p->score[2]);
pos++;
p=p->next;
}
printf("************************************************************\n");
}
LNODE * InsertNode(LNODE *head,int n)
{
LNODE *p;
LNODE *q;
LNODE *s;
int i;
int j=1;
s = (LNODE*)malloc(sizeof(LNODE));
printf("输入学号Enter the num(0:list end):");
scanf("%d",&s->ID);
printf("输入学生姓名:");
scanf("%s",&(s->name));
for(i=0;i<3;i++)
{
printf("输入第%d门课程成绩:",i+1);
scanf("%d",&(s->score[i]));
}
p=head;
while(j<=n)
{
q=p;
p=p->next;
j++;
}
s->next=q->next;
q->next=s;
return head;
}
LNODE * DelNode(LNODE *head,int n)
{
LNODE *p=NULL;
LNODE *q=NULL;
int i=1;
p=head;
while(i
q=p;
p=p->next;
i++;
}
if(head==p)
{
head=p->next;
}
else
{
q->next=p->next;
free(p);
}
printf("delete success\n");
return head;
}
LNODE * FindNode(LNODE *head,int ID)
{
LNODE *p;
int i=1;
p=head;
while((p->ID != ID) && (p != NULL))
{
p=p->next;
}
printf("the information of the find student:\n");
printf("************************************************************\n");
printf("| ID | NAME | ENGLISH | SHUXUE | YUWEN |\n");
printf("| %d | %s | %d | %d | %d |\n",p->ID,p->name,p->score[0],p->score[1],p->score[2]);
return p;
}
LNODE * SortNode(LNODE *head)
{
LNODE *max,*pmax,*nhead,*ntail,*p,*q;
p=head;
nhead=NULL;
if(p->next == NULL)
{
return p;
}
else
{
while(p->next !=NULL)
{
max=p;
for(q=p;q->next != NULL;q = q->next)
{
if(q->next->ID > max->ID)
{
pmax = q;
max = q->next;
}
}
if(max == p)
{
p=p->next;/* 若ID恰好最大的为头节点,则使节点的下一个节点为新的头结点*/
}
else
{
pmax->next=max->next;/*把最大的节点从原链表中分离出来,以便用新链表来链接*/
}
if(!nhead) /*若新头节点为空*/
{
nhead=max;
ntail=max;
}
else /*若新头节点不为空*/
{
ntail->next=max; /*将刚刚从原链表上脱离的节点接到新链表的尾节点之后*/
ntail=max; /*并使刚刚接上的节点成为新链表的新尾节点*/
}
}
ntail->next=p; /*将原链表中剩下的最后一个节点接到新链表尾节点之后*/
ntail=p; /*并使刚刚接上的节点成为新链表的新尾节点*/
ntail->next=NULL;
}
printf("sort success\n");
return nhead;
}