C语言,链表实现学生信息录入

直接上代码,不懂的话看我之前的博客
链接C语言,单链表实现,读入信息

/*头文件*/
#include <stdio.h>
#include<dos.h>      /*dos.h包含了与dos相关的结构、flags等数据,还有dos相关的低级IO函数、
                      内存访问函数、中断访问函数等等。   */
#include<stdlib.h>   /*其它说明*/
#include<string.h>   /*字符串函数*/

#include<ctype.h>    /*字符操作函数*/

#define N  3
struct Node   /*定义结构体数组用于缓存数据*/
{
 char no[20];//ID 
 char name[20];
 int score[3];
 int total; 
 float average;
 //int order;
 struct Node *next; 
};
typedef struct Node*pNode; 
/*函数原型*/

int menu_select();   /*菜单函数*/
pNode create();   /*创建链表*/
void print(pNode pHead);   /* 显示全部记录*/
void search(pNode pHead);    /*查找记录*/
void dele(pNode pHead);   /*删除记录*/
void sort(pNode pHead);    /*排序*/
void save();     /*保存文件*/
void load();        /*读文件*/

/*主函数界面*/
main()
{
    for(;;)            /*循环无限次*/
   {
   	pNode head;
   switch(menu_select())    
      {
	                  
	 case 1:
	 head=create();
	 break;/*创建成绩库*/
	 
	 case 2:
	 print(head);
	 break;/*显示成绩单*/
	 
	 case 3:
	 search(head);
	 break;/*查询*/
	 
	 case 4:
    dele(head);
	print(head);//打印每次的情况 
	 break;/*删除*/
	 
	 case 5:
	 sort(head);
	 print(head);//打印每次的情况 
	 break;/*排序*/
	 
	 case 6:
    insert(head);//数据插入 
    print(head);//打印每次的情况 
	 break;  /*&new表示返回地址*/
	 //case 7:save();break;//保存文件 
	 //case 8:load(); break;//读文件 
	 case 9:exit(0);       /*如菜单返回值为9则程序结束*/
      }
   }
}
/*菜单选择函数*/
menu_select()
{
 int n;
 printf("press any key to enter the menu......");   /*按任一键进入主菜单*/
 getch();    /*从键盘读取一个字符,但不显示于屏幕*/
 system("cls");   /*清屏*/
 printf("********************************************************************************\n");
 printf("\t\t                Welcome to\n");
 printf("\n\t\t      The student score manage system\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 ID\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");
 do
 {
    printf("\n\t\t\tEnter your choice(1~9):");  
    scanf("%d",&n);
 }while(n<1||n>9);    /*如果选择项不在1~9之间则重输*/
   return(n);           /*返回选择项,主函数根据该数调用相应的函数*/
}
/*
/*输入函数*/

/* 显示全部记录函数*/
void print(pNode pHead)
{
int i=0;     /* 统计记录条数*/
system("cls");
 printf("\n************************************STUDENT************************************\n");
 printf("-------------------------------------------------------------------------------\n");
 printf("| Rec |   Num   |   Name   |  Sc1  |  Sc2  |  Sc3  |  Sum  |   Ave   | Order |\n");
 printf("-------------------------------------------------------------------------------\n");
 pNode p=pHead->next;//跳过头节点,头节点为空 ,否则报错 
 while(p!=NULL)
 {
 	//pNode p=pHead->next;//跳过头节点,头节点为空 ,否则报错 
 	printf("| %3d |  %4s   |   %-4s   |  %3d  |  %3d  |  %3d  |  %3d  |  %4.2f  |  %-5d|\n", 
    i, p->no,p->name,p->score[0],p->score[1],p->score[2],p->total,p->average,i);
    i++;
    p=p->next;
 } 
 printf("-------------------------------------------------------------------------------\n");
 printf("**************************************END**************************************\n");
}
void insert(pNode pHead)//数据插入,前插 
{
	char Name[20],id[20];
    int ch,ma,en,su;
    int pos; 
    scanf("%d%s%s%d%d%d%d",&pos,id,Name,&ch,&ma,&en,&su);//数据输入 
    
	int i=0;
	pNode p=pHead;
	while((p!=NULL)&&(i<pos))//查找位置,即他的前一位置 
	{
		p=p->next;
		i++;
	}
	if(p==NULL||i>pos)//插入位置非法或者节点创立失败 
	{
		printf("插入位置非法或者节点创立失败,数据从0开始编号 ");
		exit(1);
	}
	pNode new_node=(pNode)malloc(sizeof(struct Node));//创立一个节点 
    //数据插入 
    strcpy(new_node->name,Name);
    strcpy(new_node->no,id);
    new_node->score[0]=ch;new_node->score[1]=ma;new_node->score[2]=en;
    new_node->total= su;
    new_node->average=su/3.0;
    //让该节点指向p节点下一个节点,p节点为该节点下一指向位置 
    new_node->next=p->next;
	p->next=new_node; 
}
void sort(pNode pHead)//排序 从小到大 
{
	int i,j;
	pNode p,q; 
	for(i=0,p=pHead->next;i<2;i++,p=p->next)// 交换思路和数组交换一致,定义两个节点,P一定要指向头节点的下一个节点,因为头节点为空 
	{
		for(j=i+1,q=p->next;j<3;j++,q=q->next)//q节点只需指向p节点下一个节点即可,毕竟j=i+1,所以q在p下一个节点 
		{
			//交换数据
			if(strcmp(p->no,q->no)>0)
			{
				//交换数据 ,采用选择排序的思路 
				int temp;temp=p->total;p->total=q->total;q->total=temp;
				temp=p->score[0];p->score[0]=q->score[0];q->score[0]=temp;
				temp=p->score[1];p->score[1]=q->score[1];q->score[1]=temp;
				temp=p->score[2];p->score[2]=q->score[2];q->score[2]=temp;
				float t;t=p->average;p->average=q->average;q->average=t;
				char c[20];strcpy(c,p->no);strcpy(p->no,q->no);strcpy(q->no,c);
				strcpy(c,p->name);strcpy(p->name,q->name);strcpy(q->name,c);
			}
		}
	}
}
void dele(pNode head)//数据删除
{
	char ID[20];
	scanf("%s",ID);
	if(head->next==NULL)
	{
		printf("空链表,长度无效");//头节点下一节点,为空,则失败,因为没有数据,也是保证数据长度有效 
		exit(1);
	}
	pNode p=head;//头节点赋值 
	head=head->next;//头节点指向下一节点 
	while(head!=NULL)//循环查找 
   {
		if(!strcmp(head->no,ID))//ID如果相等则让p指向head的下一个节点,同时释放head,因为head永远指向p的下两个节点 
		{
			p->next=head->next;
			free(head);//释放野指针 
		}
		head=head->next;//两个节点不断指向下一个节点查找 
		p=p->next;
	}
}
void search(pNode head)//数据查找,根据ID查找 
{
	char ID[20];
	scanf("%s",ID);
	int flag=0;
	if(head->next==NULL)
	{
		printf("空链表,长度无效");
		exit(1); 
	}
	pNode p=head;
	while(p!=NULL)//顺序查找 
	{
		if(!strcmp(p->no,ID))
		{
			printf("学号     \t姓名\t语文\t数学\t英语\t总分\t平均分\n"); 
            printf("%s     \t%s\t%d\t%d\t%d\t%d\t%g\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->total,p->average);
            flag=1;
		}
		p=p->next;
	}
	if(!flag)
	{
		printf("记录中未有此人\n");
	}	
} 
pNode create()//信息读入和链表创建 
{
	//人数就三个,所以长度为三
	pNode pHead=(pNode)malloc(sizeof(struct Node));//建立头节点 
	int i;
	if(pHead==NULL)//头节点创立是否成功 
	{
		printf("创建失败");
		exit(1);//检验是否成功 ,失败就退出 
	}
	else
	{
		pNode pTail=pHead;//尾节点
		pHead->next=NULL; //头节点指向空 
		for(i=0;i<N;i++)//循环创建节点 
		{
			pNode p=(pNode)malloc(sizeof(struct Node));//创建节点,让他指向下一个 
			if(p==NULL)
			{
				printf("创建失败");
		        exit(1);//检验是否成功 
			}
			else
			{
				//文件读入信息,信息输入,文件不会 
               scanf("%s",p->no);//ID 
               scanf("%s",p->name);//名字 
               scanf("%d",&(p->score[0]));//语文 
               scanf("%d",&(p->score[1]));//数学 
               scanf("%d",&(p->score[2]));//英语 
               scanf("%d",&(p->total));//总分 
               p->average=(p->score[0]+p->score[1]+p->score[2])/3.0;
               pTail->next=p;//不断 创建节点,最后总指向空 
               p->next=NULL;
               pTail=p; 				
			}
		}
	} 
 return pHead;
}

差不多做了个页面操作,其他也没啥,倒是可以看看
对称黑白棋,区别于黑白棋

  • 9
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值