main.c
实现之后才发现,头节点和头指针实际上差了很多。头节点可以直接解决的事,用头指针的时候添加删除,销毁都要考虑头指针的指向变化问题,不得不在函数中使用到二级指针,直接考虑很难想到,排查bug真让人头疼,不过最后发现这很有趣。
准备准备,学完图形的库,考虑写个小窗口环境出来,
这次的实现并没有同系统中的文件关联,
fopen,fgets fputs fclose都很有趣,
#include<stdio.h>
#include<stdlib.h>
#include"student.h"
int main(int argc, const char *argv[])
{
int button;
CL p= NULL;
for(;;)
{
menu();
scanf("%d",&button);
while(button>6 ||button <1)
{
printf("\t\t指令错误,请重新输入:");
scanf("%d",&button);
}
switch(button)
{
case 1:
insert(&p);
if(NULL == p)
{
return -1;
}
break;
case 2:
insert(&p);
break;
case 3:
show(p);
break;
case 4:
search(p);
break;
case 5:
destory(&p);
break;
case 6:
return 0;
}
}
return 0;
}
student.h
#ifndef __STUDENT_H__
#define __STUDENT_H__
typedef struct student{
int age;
char name[20];
int score;
}stu;
typedef struct class{
stu mate;
struct class *prio;
struct class *next;
}Class,*CL;
void show(CL);
CL insert(CL*);
void search(CL);
CL destory(CL *p);
void menu();
#endif
student.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"student.h"
void show(CL p)
{
if(NULL == p)
{
printf("\t\t%s 班级为空\n",__FUNCTION__);
return ;
}
CL q = p;
printf("\t====================================\n");
printf("\t\t姓名\t学号\t分数\n");
do{
printf("\t\t%s\t%d\t%d\n",q->mate.name,q->mate.age,q->mate.score);
q = q->next;
}while(q != p);
}
CL insert(CL *p)
{
int age,score;
char name[30] = "";
if(NULL == *p)
{
printf("班级为空,开始添加学生信息\n");
CL head = (CL)malloc(sizeof(Class));
if(NULL == head)
{
printf("\t\t%s 空间申请失败\n",__FUNCTION__);
return NULL;
}
printf("\t\t请分别输入学生信息\n");
printf("\t\t姓名:__________\b\b\b\b\b\b\b\b\b\b");
scanf("%s",name);
printf("\t\t学号:___\b\b\b");
scanf("%d",&age);
printf("\t\t成绩:___\b\b\b");
scanf("%d",&score);
head->mate.age = age;
head->mate.score = score;
strcpy(head->mate.name,name);
head->next = head;
head->prio = head;
*p = head;
return head;
}
CL insert = (CL)malloc(sizeof(Class));
if(NULL == insert)
{
printf("\t\t%s 空间申请失败\n",__FUNCTION__);
return NULL;
}
printf("\t\t请分别输入学生信息\n");
printf("\t\t姓名:__________\b\b\b\b\b\b\b\b\b\b");
scanf("%s",name);
printf("\t\t学号:___\b\b\b");
scanf("%d",&age);
printf("\t\t成绩:___\b\b\b");
scanf("%d",&score);
insert->mate.age = age;
insert->mate.score = score;
strcpy(insert->mate.name,name);
insert->next = (*p);
insert->prio =(*p)->prio;
(*p)->prio->next = insert;
(*p)->prio = insert;
*p = insert;
return *p;
}
void search(CL p)
{
if(NULL == p)
{
printf("\t\t%s 班级为空\n",__FUNCTION__);
return ;
}
int tag;
printf("\t\t请选择查询方式:\n\t\t1:查询学号\n\t\t2:查询姓名\n\t\t3:查询成绩\n");
printf("\t\t请输入选择方式对应的序号<1 OR 2 OR 3>: _\b");
scanf("%d",&tag);
while(tag<1 || tag>3)
{
printf("输入有误,请重新输入\n");
while(getchar());
scanf("%d",&tag);
}
CL q = p;
int num,sc;
int FLAG = 0;
char buffer[30] = "";
switch(tag)
{
case 1:
{
printf("\t\t请输入要查询的学号:__\b\b");
scanf(" %d",&num);
do{
if(num == q->mate.age)
{
printf("\t\t姓名:%s__学号:%d__成绩:%d\n",q->mate.name,q->mate.age,q->mate.score);
FLAG = 1;
}
q = q->next;
}while(q != p);
if(0 == FLAG)printf("\t\t查无此人\n");
break;
}
case 2:
{
printf("\t\t请输入要查询的姓名:");
scanf(" %s",buffer);
do{
if(!strcmp(buffer,q->mate.name))
{
printf("\t\t姓名:%s__学号:%d__成绩:%d\n",q->mate.name,q->mate.age,q->mate.score);
FLAG = 1;
}
q = q->next;
}while(q != p);
if(0 == FLAG)printf("\t\t查无此人\n");
break;
}
case 3:
{
printf("\t\t请输入要查询的成绩:");
scanf(" %d",&sc);
do{
if(sc == q->mate.score)
{
printf("\t\t姓名:%s__学号:%d__成绩:%d\n",q->mate.name,q->mate.age,q->mate.score);
FLAG = 1;
}
q = q->next;
}while(q != p);
if(0 == FLAG)printf("\t\t查无此人\n");
break;
}
}
}
CL destory(CL *p)
{
if(NULL == *p)
{
printf("\t\t%s 班级为空\n",__FUNCTION__);
return NULL;
}
int num = 0;
printf("\t\t请输入要删除学生的学号:____\b\b\b\b");
scanf("%d",&num);
CL q = (*p);
do{
if(num == q->mate.age)
{
if(q->next == q)
{
free(q);
(*p) = NULL;
q = NULL;
printf("删除成功\n");
return NULL;
}
if(q == (*p))
{
(*p) = q->next;
q->prio->next = (*p);
free(q);
q = NULL;
printf("删除成功\n");
return *p;
}
q->next->prio = q->prio;
q->prio->next = q->next;
free(q);
q = NULL;
printf("删除成功\n");
return *p;
}
q = q->next;
}while(q != *p);
printf("\t\t查无此人\n");
}
void menu()
{
printf("\t============================================================\n");
printf("\t====================--------------------====================\n");
printf("\t====================| 学生信息管理系统 |====================\n");
printf("\t====================--------------------====================\n");
printf("\n");
printf("\t\t\t\t1:创建班级成员\n");
printf("\t\t\t\t2:添加学生\n");
printf("\t\t\t\t3:查看学生信息\n");
printf("\t\t\t\t4:查找对应学生\n");
printf("\t\t\t\t5:删除学生信息\n");
printf("\t\t\t\t6:退出菜单\n");
printf("\n");
printf("\t请输入要执行的对应操作:");
}