直接上代码,不懂的话看我之前的博客
链接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;
}
差不多做了个页面操作,其他也没啥,倒是可以看看
对称黑白棋,区别于黑白棋