刚学完C语言,尝试着用C语言写一个小项目用来练练手,若有不足之处,欢迎各方大佬多多指点!
- 定义结构体
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
char ID[20]; //学号
char name[9]; //姓名
char sex; //性别
int age; //年龄
char nation[9]; //民族
struct node *next;
}node,*pnode;
- 函数声明
void error_allot(pnode q); //辅助函数:内存分配失败
pnode init(void); //操作函数:初始化
void quit(int n); //辅助函数:1.选择时输入规则以外的数 2.返回系统
void end_error(int n); //辅助函数:操作成功和查询无果以及返回系统
pnode insert(pnode q,int b[1]); //操作函数:录入学生信息
void traverse(pnode p); //输出函数:显示学生信息列表
pnode get(pnode q,pnode *per,int n); //通过输入学生姓名或学号获取要删除学生在列表中的位置信息并返回给操作函数
pnode delete_list(pnode p,int b[1]); //操作函数:删除学生信息
void get_data(pnode q,int n); //辅助函数:通过输入学生姓名或学号获取要查询的学生在列表中的位置信息并返回给操作函数
void search(pnode p); //操作函数:查询学生信息
pnode revise_data(pnode q,pnode *per,int t[1]);//辅助函数:通过输入学生学号获取要修改的学生在列表中的位置信息并返回给操作函数
pnode revise_element(pnode h,int n); //操作函数:修改学生学号、姓名、性别、年龄、民族信息
pnode revise(pnode p); //选择函数:选择要修改学生信息:学号、姓名、性别、年龄、民族
- 主函数
int main() //主函数
{
int n,a,b[1]={1};
pnode L;
printf("\n &欢迎使用学生信息管理系统&\n\n\n ^*^输入1进入系统:");
scanf("%d",&a);
if(a==1)
{
L=init();
while(a==1)
{
system("cls");
printf("\n $学生信息管理系统$\n\n\n");
printf(" 1.录入 2.列表 3.删除 4.查询 5.修改 6.退出\n");
printf("\n\n^*^请选择:");
scanf("%d",&n);
if(n==6)
{
system("cls");
printf("\n\n\n ^*^感谢使用学生管理系统,祝您生活愉快!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
exit(-1);
}
switch(n)
{
case 1:L=insert(L,b);break;
case 2:traverse(L);break;
case 3:L=delete_list(L,b);break;
case 4:search(L);break;
case 5:L=revise(L);break;
default:quit(1);
}
}
}
else
{
printf("\n\n @ # @ 无规矩不成方圆,请按规矩办事,谢谢!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
exit(-1);
}
return 0;
}
- 函数块:内存分配失败
void error_allot(pnode q) //辅助函数:内存分配失败
{
if(q==NULL)
{
printf("内存分配失败!\n");
exit(-1);
}
return;
}
- 函数块:初始化
pnode init(void) //操作函数:初始化
{
pnode head,last,p;
system("cls");
head=(pnode)malloc(sizeof(node));
error_allot(head);
last=head;
last->next=NULL;
p=(pnode)malloc(sizeof(node));
error_allot(p);
printf("\n $初始化$\n\n");
printf("\n 【 1.输入:按顺序输入; 2.学号:位数不超过二十位; 3.性别:'M'表示男生,'W'表示女生; 4.民族:如苗族 】\n");
printf("\n\n^*^请输入学生信息:学号,姓名,性别,年龄,民族:\n");
scanf("%s %s %c %d %s",p->ID,p->name,&p->sex,&p->age,p->nation);
last->next=p;
p->next=NULL;
last=p;
return head;
}
- 函数块:辅助录入(1)
void quit(int n) //辅助函数:1.选择时输入规则以外的数 2.返回系统
{
int b;
if(n==1)
{
system("cls");
printf("\n\n (0)&(0)输入错误,输入0返回系统\n");
}
if(n==2) printf("\n\n\n【输入0返回系统】");
scanf("%d",&b);
if(b==0)
{
system("cls");
return;
}
else
{
printf("\n\n @ # @ 无规矩不成方圆,请按规矩办事,谢谢!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
exit(-1);
}
}
- 函数块:辅助录入(2)
void end_error(int n) //辅助函数:操作成功和查询无果以及返回系统
{
int b;
system("cls");
if(n==1) printf("\n\n ^$^ 录入成功,输入0返回系统\n");
else if(n==2) printf("\n\n ^$^ 删除成功,输入0返回系统\n");
else if(n==3) printf("\n\n @ # @ 无此信息,输入0返回系统\n");
else if(n==4) printf("\n\n @ # @ 无此信息,输入0返回系统\n");
else if(n==5) printf("\n\n ^$^ 排序成功,输入0返回系统\n");
else printf("\n\n ^$^ 修改成功,输入0返回系统\n");
scanf("%d",&b);
if(b==0) system("cls");
else
{
system("cls");
printf("\n\n @ # @ 无规矩不成方圆,请按规矩办事,谢谢!\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
exit(-1);
}
return;
}
- 函数块:录入学生信息
pnode insert(pnode q,int b[1]) //操作函数:录入学生信息
{
pnode h,k=q->next;
int n,i;
system("cls");
printf("\n $录入$\n\n");
printf("\n ^*^请输入要录入学生人数n(n>0):");
scanf("%d",&n);
if(n<=0)
{
quit(1);
return q;
}
for(i=1;i<=n;i++)
{
system("cls");
h=(pnode)malloc(sizeof(node));
error_allot(h);
printf("\n 【 1.输入:按顺序输入; 2.学号:位数不超过二十位; 3.性别:'M'表示男生,'W'表示女生; 4.民族:如苗族 】\n");
printf("\n\n^*^请输入学生信息:学号,姓名,性别,年龄,民族(第%d次输入):\n",i);
scanf("%s %s %c %d %s",h->ID,h->name,&h->sex,&h->age,h->nation);
q->next=h;
h->next=k;
k=h;
b[0]++;
}
end_error(1);
return q;
}
- 函数块:显示学生信息列表
void traverse(pnode p) //输出函数:显示学生信息列表
{
pnode h;
system("cls");
h=p->next;
printf("\n $列表$\n\n\n\n");
printf(" %10s%10s%10s%10s%10s\n\n","ID","name","sex","age","nation");
if(h==NULL)
{
quit(2);
return;
}
while(h!=NULL)
{
printf(" %10s%10s%10c%10d%10s\n",h->ID,h->name,h->sex,h->age,h->nation);
h=h->next;
}
quit(2);
return;
}
- 函数块:辅助删除
pnode get(pnode q,pnode *per,int n) //通过输入学生姓名或学号获取要删除学生在列表中的位置信息并返回给操作函数
{
pnode h;
char a[9],b[20];
*per=q;
h=q->next;
system("cls");
if(n==1)
{
printf("\n^*^请输入要删除学生的姓名:\n");
scanf("%s",a);
while((h!=NULL)&&(strcmp(h->name,a)!=0))
{
*per=h;
h=h->next;
}
if(strcmp(h->name,a)!=0) *per=NULL;
}
else
{
printf("\n^*^请输入要删除学生的学号:\n");
scanf("%s",b);
while((h!=NULL)&&(strcmp(h->ID,b)!=0))
{
*per=h;
h=h->next;
}
if(strcmp(h->ID,b)!=0) *per=NULL;
}
return h;
}
- 函数块:删除学生信息
pnode delete_list(pnode p,int b[1]) //操作函数:删除学生信息
{
pnode h,per;
int n;
system("cls");
printf("\n $删除$\n\n\n");
printf(" 1.姓名删除 2.学号删除 3.返回系统\n");
printf("\n ^*^请选择:");
scanf("%d",&n);
switch(n)
{
case 1:h=get(p,&per,n);break;
case 2:h=get(p,&per,n);break;
case 3:system("cls");return p;
default:quit(1);
}
if(per==NULL)
{
end_error(4);
return p;
}
per->next=h->next;
b[0]--;
free(h);
h=NULL;
end_error(2);
return p;
}
- 函数块:辅助查询
void get_data(pnode q,int n) //辅助函数:通过输入学生姓名或学号获取要查询的学生在列表中的位置信息并返回给操作函数
{
pnode h;
int k,t;
char a[9],b[20];
h=q;
system("cls");
if(n==1)
{
k=0;
t=0;
printf("\n^*^请输入要查询学生的姓名:\n");
scanf("%s",a);
system("cls");
while(h!=NULL)
{
if((strcmp(h->name,a)==0)&&(k==1))
{
t=1;
printf(" %10s%10s%10c%10d%10s\n",h->ID,h->name,h->sex,h->age,h->nation);
}
if((strcmp(h->name,a)==0)&&(k==0))
{
k=1;
t=1;
printf("\n $信息$\n\n\n\n");
printf(" %10s%10s%10s%10s%10s\n\n","ID","name","sex","age","nation");
printf(" %10s%10s%10c%10d%10s\n",h->ID,h->name,h->sex,h->age,h->nation);
}
h=h->next;
}
if(t==0)
{
end_error(3);
return;
}
}
else
{
t=0;
printf("\n^*^请输入要查询学生的学号:\n");
scanf("%s",b);
system("cls");
while(h!=NULL)
{
if((strcmp(h->ID,b)==0))
{
t=1;
printf("\n $信息$\n\n\n\n");
printf(" %10s%10s%10s%10s%10s\n\n","ID","name","sex","age","nation");
printf(" %10s%10s%10c%10d%10s\n",h->ID,h->name,h->sex,h->age,h->nation);
}
h=h->next;
}
if(t==0)
{
end_error(3);
return;
}
}
quit(2);
return;
}
- 函数块:查询学生信息
void search(pnode p) //操作函数:查询学生信息
{
int n;
system("cls");
printf("\n $查询$\n\n\n\n");
printf(" 1.姓名查询 2.学号查询 3.返回系统\n\n");
printf("\n ^*^请选择:");
scanf("%d",&n);
system("cls");
switch(n)
{
case 1:get_data(p,n);break;
case 2:get_data(p,n);break;
case 3:system("cls");return;
default:quit(1);
}
return;
}
- 函数块:辅助修改(1)
pnode revise_data(pnode q,pnode *per,int t[1]) //辅助函数:通过输入学生学号获取要修改的学生在列表中的位置信息并返回给操作函数
{
char b[20];
pnode h=q->next;
*per=q;
system("cls");
printf("\n^*^请输入要修改学生的学号:\n");
scanf("%s",b);
system("cls");
while(h!=NULL && strcmp(h->ID,b)!=0)
{
*per=h;
h=h->next;
}
if(h!=NULL) t[0]++;
return h;
}
- 函数块:辅助修改(2)
pnode revise_element(pnode h,int n) //操作函数:修改学生学号、姓名、性别、年龄、民族信息
{
pnode k=h;
int a;
char b[20],c[9],f[2],g[9];
switch(n)
{
case 1:
{
system("cls");
printf("\n^*^请输入新的学号:\n");
scanf("%s",b);
strcpy(k->ID,b);
}return k;
case 2:
{
system("cls");
printf("\n^*^请输入新的姓名:\n");
scanf("%s",c);
strcpy(k->name,c);
}return k;
case 4:
{
system("cls");
printf("\n^*^请输入新的年龄:\n");
scanf("%d",&a);
k->age=a;
}return k;
case 5:
{
system("cls");
printf("\n^*^请输入新的民族:\n");
scanf("%s",g);
strcpy(k->nation,g);
}return k;
case 3:
{
system("cls");
printf("\n^*^请输入新的性别:\n");
scanf("%s",f);
k->sex=f[0];
}return k;
default:quit(1);
}
return k;
}
- 函数块:修改学生信息
pnode revise(pnode p) //选择函数:选择要修改学生信息:学号、姓名、性别、年龄、民族
{
int n,a,t[1]={0};
pnode h,per,k;
system("cls");
printf("\n $修改$\n\n\n\n");
printf(" 1.开始修改 2.返回系统\n\n");
printf("\n ^*^请选择:");
scanf("%d",&n);
system("cls");
switch(n)
{
case 1:
{
printf("\n $选择$\n\n\n\n");
printf(" 1.修改学号 2.修改姓名 3.修改性别 4.修改年龄 5.修改民族\n\n");
printf("\n ^*^请选择:");
scanf("%d",&a);
h=revise_data(p,&per,t);
if(t[0]==0)
{
end_error(3);
return p;
}
k=h;
switch(a)
{
case 1:k=revise_element(h,a);break;
case 2:k=revise_element(h,a);break;
case 3:k=revise_element(h,a);break;
case 4:k=revise_element(h,a);break;
case 5:k=revise_element(h,a);break;
default:quit(1);
}
h=k;
}break;
case 2:system("cls");return p;
default:quit(1);
}
per->next=h;
end_error(6);
return p;
}
小小推荐:
C语言案例系列:
C语言实现——登录界面
前端案例系列:
前端小案例:登录页面
撕烂数据爆锤算法系列:
撕烂数据爆锤算法:单链表
撕烂数据爆锤算法:循环链表
萌新求带,望大家多多支持!