/*所使用的头文件*/
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
/*所调用的函数*/
struct LINK_NODE *creat(struct LINK_NODE *head); //创建新结点
int Count_Node(struct LINK_NODE *head); //结点计数
void Delete_Node_Num(struct LINK_NODE *head); //删除第某个结点
//void Delete_Node_Data(struct LINK_NODE *head); //按数据删除结点
void Cut_Node_In(struct LINK_NODE *head); //插入结点
void Display_Node(struct LINK_NODE *head); //显示当前的结点内容
void fun(); /*综合功能函数*/
/*结构体*/
struct LINK_NODE
{
long id;
char name[10];
float yuwen;
float shuxue;
float yingyu;
struct LINK_NODE *next;
};
/*主函数*/
int main()
{
int ID;
int keywords;
printf("\t请输入用户名:");
scanf(" %d",&ID);
printf("\t请输入用户密码:");
scanf(" %d",&keywords);
if(ID == 123 && keywords == 123)
{
fun();
}
else
{
printf("\a用户名或密码错误!系统拒绝访问!\n\n请按任意键退出!\n\n");
}
system("pause");
return 0;
}
/*综合功能函数*/
void fun()
{
int c;
char ch;
struct LINK_NODE *head = NULL;
system("cls");
while(1)
{
printf("\n\t\t--\t 欢迎使用学生成绩管理系统 \t --\n");
printf("\t\t---------------------------------------------------\n");
printf("\t\t|\t\t 0.输入学生信息\t\t |\n\n");
printf("\t\t|\t\t 1.删除数据信息\t\t |\n\n");
printf("\t\t|\t\t 2.插入学生信息\t\t |\n\n");
printf("\t\t|\t\t 3.显示学生信息\t\t |\n\n");
printf("\t\t|\t\t 4.------------\t\t |\n\n");
printf("\t\t|\t\t 5.------------\t\t |\n\n");
printf("\t\t|\t\t 6.------------\t\t |\n\n");
printf("\t\t|\t\t 7.------------\t\t |\n\n");
printf("\t\t|\t\t 8.------------\t\t |\n\n");
printf("\t\t|\t\t 9.--- 退出 ---\t\t |\n");
printf("\t\t---------------------------------------------------\n");
printf("请选择栏目(输入序号):");
scanf(" %d",&c);
getchar();
switch(c)
{
case 0:
system("cls");
head = creat(head);
printf("是否输入数据?(y/n):");
scanf(" %c",&ch); //%c前加空格
while(ch == 'y'||ch == 'Y') //用于循环输入数据
{
head = creat(head);
printf("是否输入数据?(y/n):");
scanf(" %c",&ch); //%c前加空格
}
system("pause");
system("cls");
break;
case 1:
Delete_Node_Num(head);
system("cls");
break;
case 2:
Cut_Node_In(head);
system("pause");
system("cls");
break;
case 3:
system("cls");
Display_Node(head);
system("pause");
system("cls");
break;
case 4:
system("pause");
system("cls");
break;
case 5:
system("pause");
system("cls");
break;
case 6:
system("pause");
system("cls");
break;
case 7:
system("pause");
system("cls");
break;
case 8:
system("pause");
system("cls");
break;
case 9:
system("cls");
printf("\n\t感谢您的使用!\n\n");
system ("pause");
exit(0);
}
}
}
/*创建新的结点*/
struct LINK_NODE *creat(struct LINK_NODE *head)
{
char s[10];
long i;
float score1,score2,score3;
struct LINK_NODE *p1 = NULL,*p2 = head;
p1 = (struct LINK_NODE *)malloc(sizeof(struct LINK_NODE)); //动态申请(分配)内存,用来建立新的结点
if(!head) //检查头结点指针是否为空
{
head = p1;
head->next = NULL;
return head;
}
else
{
while(p2->next != NULL)
{
p2 = p2->next;
}
p2->next = p1;
p1->next = NULL;
printf("请输入学号:");
scanf(" %d",&i); //%d前加空格
p1->id = i;
getchar();
printf("请输入姓名:");
gets(p1->name);
printf("请输入数学成绩:");
scanf(" %f",&score1); //%d前加空格
p1->shuxue = score1;
printf("请输入语文成绩:");
scanf(" %f",&score2); //%d前加空格
p1->yuwen = score2;
printf("请输入英语成绩:");
scanf(" %f",&score3); //%d前加空格
p1->yingyu = score3;
}
return head;
}
/*结点计数*/
int Count_Node(struct LINK_NODE *head)
{
int i = 1; //结点数从1开始,是因为头结点不录入数据
struct LINK_NODE *p = head;
do
{
p = p->next;
++i;
}
while(p->next != NULL); //直到指针指向最后一个结点时,停止移动
return i; //返回结点个数给函数
}
/*删除第某个结点*/
void Delete_Node_Num(struct LINK_NODE *head)
{
int i, Count;
int a = 1;
struct LINK_NODE *p1 = head,*p2 = NULL;
system("cls");
Display_Node(head);
Count = Count_Node(head);
printf("\n请输入想要删除第几个数据信息:");
scanf(" %d",&i); //%d前加空格
if(i <= 0) //头结点不允许删除,若删除将影响接下来的链
{
printf("头结点不可删除!!\n");
}
else if(i >= Count) //所要删除的结点数不可以大于链表的长度
{
printf("输入结点数有误!!\n");
}
else if(i == Count) //若删除的是尾结点,则将倒数第二个的 next 赋值为 NULL
{
while(p1->next)
{
p1 = p1->next;
}
p2 = head;
while((p2->next)!=p1)
{
p2 = p2->next;
}
p2->next = NULL;
free(p1); //删除结点后,释放之前所占用的内存
}
else //所删除的结点在链表中(非首非尾)
{
while(!(i==a))
{
p1 = p1->next;
++a;
}
p2 = p1->next;
p1->next = p2->next;
free(p2); //删除结点后,释放之前所占用的内存
}
printf("操作成功!!\n");
Display_Node(head);
system("pause");
}
/*按数据删除结点*/ //功能未建设完全,存在BUG
void Delete_Node_Data(struct LINK_NODE *head)
{
int num = 0,i = -1;
struct LINK_NODE *p1 = head, *p2 = NULL;
printf("\n请输入要删除的数据:");
scanf(" %d",&num);
if(head->next == NULL)
{
printf("\n链表中不存在任何数据!!\n");
exit(0);
}
p2 = p1->next;
while(p2->next != NULL)
{
p2 = p1->next;
i = p2->id;
if(p2->id == num )
{
break;
}
}
if(i != num)
{
printf("\n链表中没有您要删除的数据!!\n");
exit(0);
}
p1->next = p2->next;
free(p2); //结点删除后要释放掉所删除结点占用的内存空间,达到节约内存的目的
}
/*插入结点*/
void Cut_Node_In(struct LINK_NODE *head)
{
int n = -1, i, Count = Count_Node(head),a;
float score1,score2,score3;
system("cls");
Display_Node(head);
struct LINK_NODE *p1 = head, *p2 = NULL;
p2 = (struct LINK_NODE *)malloc(sizeof(struct LINK_NODE));
if(p2 == NULL)
{
printf("内存空间不够,无法添加新的数据!!\n");
exit(0);
}
else
{
printf("请输入学号:");
scanf(" %d",&i); //%d前加空格
p2->id = i;
getchar();
printf("请输入姓名:");
gets(p2->name);
printf("请输入语文成绩:");
scanf(" %f",&score2); //%d前加空格
p2->yuwen = score2;
printf("请输入数学成绩:");
scanf(" %f",&score1); //%d前加空格
p2->shuxue = score1;
printf("请输入英语成绩:");
scanf(" %f",&score3); //%d前加空格
p2->yingyu = score3;
printf("将数据插入为第哪个数:");
scanf(" %d",&n);
if(n <= 0)
{
printf("此处不可插入数据!!\n");
exit(0);
}
else if(n > Count)
{
printf("此处不可插入数据!!\n");
exit(0);
}
for(i = 0; i <= Count; )
{
i++;
if(i == n)
{
p2->next = p1->next;
p1->next = p2;
break;
}
else
{
p1 = p1->next;
}
}
printf("操作成功!!\n");
Display_Node(head);
}
}
/*显示当前的结点内容*/
void Display_Node(struct LINK_NODE *head)
{
int i = 1; //回避头结点(不打印头结点)
struct LINK_NODE *p = head;
if(head == NULL) //若传进来的链表头指针为 NULL,则做出错误判断
{
printf("\n用户尚未录入任何数据!!\n");
}
else if( p->next == NULL)
{
printf("\该系统内未找到任何数据!!\n");
}
else
{
system("cls");
printf("当前全部学生信息如下:\n");
do //1传进来的链表头指针不为 NULL,则挨个打印,直到尾结点
{
p = p -> next;
printf("\t%d------------------------\n",i);
printf("\t 学号:%d\n",p->id);
printf("\t 姓名:%s\n",p->name);
printf("\t 语文:%.2f\n",p->yuwen);
printf("\t 数学:%.2f\n",p->shuxue);
printf("\t 英语:%.2f\n",p->yingyu);
i++;
}
while(p -> next != NULL);
}
}
学生成绩管理系统(链表的实现)
最新推荐文章于 2024-04-05 00:14:28 发布