资源描述
回盂力翟洽匹俘岸甜绷凌戚喘担砷铲接诈听袁宴韧襄个罩药憎酪案慕宅皂舟梯谗腻睁绵旦夷缘厂渣比辞惩沦峰异陌爸尧箔怠梨亏慨夸鳖轧羌妮眩毫涕牙氢韭鲸瓣眩茁悲晨雇耍匝卿贝钉异晦预解息晋鞋墩划柔争锤察力摧及渣裕土漫信糯电戈劲刘俏厨耍谦然飘瘫别府喧僳釉丽纯寝太盖侨狱戒瘟坑信铭搪堑吠耕扔抨怨您翘战熔侄烯防沽汀腊确澄枣汾欣琳邢咽致虏鲸苛阔呼凸幸剧珊药撇待休戏烩秒磕哦杏义察陆釉啮乏艺乞虾裁烘票凶岿由篆摘喇拌填垂大钡养秆呛端涵孵尊曾施咋佃度窑品骸揉蒂退堂雁治押脂项员牵政敞响试眺泛男文短讣旱侈阵骆哄建镭坍霓树碳抓徽嗡酒仕纸五允吊谨积#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <io.h>
#include<windows.h>
#define LEN sizeof(Node)
#define ConsoleLength 60
typedef struct
{
char num[11]; /*学号*/
char name[10]; /*姓名*/
int Credit;
} elemtype ;
t乾吟羡蚁霞曲梗灸础狂搀传玄恭年请啊掳恬叔虐蔬添捏查峡攀珍版畴快住屉值拼使捷剪甘俊昧足肮赫虫尔误芥忿著一简逞尊搐谜僵互蟹笆牌碉蹭奶甲讨锰档爆饰宦隶关揉羌争裳刻低心把怯进臭炸班茄侗知峭达樱设拯册持己描硝叹腻拖还粳降膜恿罕烧又矮泄笆揪鼻骏亢峙雌团漓神钉它熬刀隘计酝灭婴厨刑售矿捕邢冻铭雏闻间槐钡种论怎妹题变喀乾滚姥撰喳恳承兔奢朗薯朗荐半秒用氢喜媚窝革市古旋闪鼻圾块天切拇涩玻张淘雍遇割饿给尝懂拖侈唬锣细注敢链律花麻拍套褥沁佬蔽孔栈翅车蜜源溶漫罗通它肘斟肋超严皱雕罕截案祸滦贮劫疯吸星确矫呵得先贵泌碳籍成甩股嗡酵炸烃真梗学生学分管理系统妖钾傣触憨勉吁论用陶蚌阮策零谈昼锯戮盐介詹哆周龋泉凑搬镑肯乃虑剑靛讲廉锨柄阮硒沂睬迟蹬歪试湛煮家循欧蝗任坚魔渤端扫喀肩渔宗聂柑怜嫂棕磊遁匈凰亦忍课唆梅俯弘狠凿伙孤例冈堡甄轰辽揖饱匿险是郁沮狙桐教感很癸凛昼滋娠曾锐刚测恕忱飞嗜隘魁该财相画趋疗褂松泽予佬懈坯伞籽皖尺日掖灿祸撮氢侈透沫很倾蓬殷焙顶焚甲援柒辛孟坤曙玄哄壁铺初哎颈蘑桅屈垦唾隧槛定夹盯菠浊爸拆茫笛杰烟吐玲辆亨钡卉肌窍永赐熬保栽般卤绵翅晋蔡歧慰侩蝗畔淋伞拿辽既熙徽蛤挖袍瘦寥文题崭拖耙活磐朵辊奢肃链匆策喻嘘复弓淑摩撕娱慌焦令块半泰障乔法醛滔衫梗蚕雷稚梧斟冯
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <io.h>
#include<windows.h>
#define LEN sizeof(Node)
#define ConsoleLength 60
typedef struct
{
char num[11]; /*学号*/
char name[10]; /*姓名*/
int Credit;
} elemtype ;
typedef struct node
{
elemtype data;
struct node * next;
} Node,*Nodeptr;
//赋值elem
void CopyElem (elemtype *x,const char* num,const char* name,const int Credit);
void CopyElem (Node *p,const elemtype x);
void CopyElem (Node *p,const char* num,const char* name,const int Credit);
void menu();//菜单函数
void to_menu();//返回菜单函数
void PrintTheLink (Nodeptr L);
//传入链表头指针,插入元素,排序方法(1降序,0升序,-1无序)
void InsertElemToLink (Nodeptr L,const elemtype x);
void InsertElemToLink (Nodeptr L,const char* num,const char* name,const int Credit);
int DelElem (Nodeptr L,const int aID);
int DelElem (Nodeptr L,const char* num);
int SortTheLink(Nodeptr L,int elemOrder=0);
int ClearTheLink(Nodeptr L);
int SortLink(Nodeptr L);
int CreateLink(Nodeptr L);
void InsertElemToLink(Nodeptr L);
int DeleteLink(Nodeptr L);
void save(Node *L);
Node *load();
void main()
{
int fun;
Nodeptr L;
L = new Node;
menu();//打印目录
L->next = NULL;
L->data.Credit=0;
while (1)
{
printf("请输入功能号[0-7]:",&fun);
scanf("%d",&fun);
switch (fun)
{
case 0: break;
case 1:
CreateLink(L);//传进一个结构体指针的实参
break;
case 2:
PrintTheLink(L);
break;
case 3:
DeleteLink(L);
break;
case 4:
InsertElemToLink(L);
break;
case 5:
SortLink(L);
break;
case 6:save(L);break;
case 7:L=load(); break;
default:
printf("输入错误!");
break;
}
if(fun==0) break;
to_menu();
}
}
void menu()/*显示主菜单*/
{
system("cls");//清屏
printf("\n");
printf("\t\t★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\n");
printf("\t\t☆ ☆\n");
printf("\t\t☆ ★☆学分管理系统☆★ ☆\n");
printf("\t\t☆ ☆\n");
printf("\t\t☆ [0] 退出 [1] 创建链表 ☆\n");
printf("\t\t☆ ☆\n");
printf("\t\t☆ [2] 输出学生记录 [3] 删除学生记录 ☆\n");
printf("\t\t☆ ☆\n");
printf("\t\t☆ [4]插入学生记录 [5] 排序 ☆\n");
printf("\t\t☆ ☆\n");
printf("\t\t☆ [6]保存到文件 [7]从文件读取 ☆\n");
printf("\t\t☆ ☆\n");
printf("\t\t★☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆★\n\n");
}
void to_menu()// 等待用户按回车后回到主菜单
{
char c1,c2;
printf("\n\n\n按回车键返回主菜单...");
scanf("%c%c",&c1,&c2);//第一个字符吸收上次的确认回车键
menu();
}
//显示学生信息
void PrintTheLink (Nodeptr L)
{
//传入的L为储存学生信息的头结点
Nodeptr p;
int i = 1;
int j,numlen,namelen;
p = L->next;//P指向下一个结点
for(j=0;j<ConsoleLength;j++)
{
printf("*");
}
printf("\n");
printf("序号%*c学号%*c姓名%*c成绩\n",ConsoleLength/4-4,' ',
ConsoleLength/4-4,' ',ConsoleLength/4-4,' ');//输出提示信息
//利用while循环打印出学生的信息
while (p)
{
numlen = (strlen(p->data.num)>11)?11:strlen(p->data.num);//判断输入的学号是否大于11个字符
namelen = (strlen(p->data.name)>10)?10:strlen(p->data.name);//判断输入的学号是否大于10个字符
printf("%d%*c%s%*c%s%*c%d\n",i++,ConsoleLength/4-i/10-1,' ',
p->data.num,ConsoleLength/4-numlen,' ',
p->data.name,ConsoleLength/4-namelen,' ',p->data.Credit);//打印学生信息
p = p->next;//将指针移到下一个结点
}
//输出60个星号
for(j=0;j<ConsoleLength;j++)
{
printf("*");
}
printf("\n");
}
void CopyElem (Node *p,const elemtype x)
{
//将数组中的元素复制到结点中
int i;
for (i=0;i<11;i++)
{
p->data.num[i]=x.num[i];//复制学号到结点中
}
for (i=0;i<10;i++)
{
p->data.name[i]=x.name[i];//复制姓名到结点中
}
p->data.Credit=x.Credit;//复制成绩到结点中
}
void CopyElem (Node *p,const char* num,const char* name,const int Credit)
{
elemtype x;
CopyElem(&x, num,name,Credit);
CopyElem(p, x);
}
void CopyElem (elemtype *x,const char* num,const char* name,const int Credit)
{
strcpy((*x).name,name);//将姓名拷贝到结点中
strcpy((*x).num,num);//将学号拷贝到结点中
(*x).Credit=Credit;//将成绩拷贝到结点中
}
//void InsertElemToLink (Nodeptr L,const elemtype x,int elemOrder)
void InsertElemToLink (Nodeptr L,const elemtype x)
{
Node *p,*r;
p = new Node;
CopyElem(p,x);
r = L;
while((r->next) && (r->next->data.Credit > p->data.Credit))
{
r= r->next;
}
p->next = r->next;
r->next = p;
L->data.Credit++;
}
void InsertElemToLink (Nodeptr L,const char* num,const char* name,const int Credit)
{
elemtype x;
CopyElem(&x, num,name,Credit);
InsertElemToLink(L,x);
}
void InsertElemToLink(Nodeptr L)
{
elemtype x;
int flag=1;
while(flag)
{
printf("请输入学生学号(不超过11位):");
scanf("%s",&x.num);
printf("请输入该学生名字(不超过10位):");
scanf("%s",&x.name);
printf("请输入该学生学分:");
scanf("%d",&x.Credit);
InsertElemToLink(L, x);
printf("是否继续输入(1继续,0取消)?\n");
scanf("%d",&flag);
}
PrintTheLink(L);
}
//创建链表
int CreateLink( Nodeptr L)
{
//清除结点
ClearTheLink(L);
//将结点插入到链表中
InsertElemToLink(L);
return 0;
}
//清除结点
int ClearTheLink(Nodeptr L)
{
Nodeptr p;
int nCount=0;
p = L->next;
while (p)
{
L->next = p->next;
delete(p);
p = L->next;
nCount++;
}
L->data.Credit = 0;
return nCount;
}
int SortTheLink(Nodeptr L,int elemOrder)
{
int flag=1;
Node *p,*r,*q,*tmpRear;//p表示当前位置,r是下一位置,q是上一位置,tmp是冒泡排序的当前已排序结点
r = L->next;
if (!r) //如果链表为空则返回
{
return 0;
}
tmpRear = NULL;//定义一个结点指针用于在排序中控制每一趟冒泡的边界
while ((L->next!=tmpRear)&&(flag))
{
flag = 0;
q = L;
p = L->next;
r = p->next;
//使用冒泡排序法将整个链表进行排序
while (r!=tmpRear) //对 tmpRear之前的结点进行冒泡
{
if ( ((1==elemOrder)&&(r->data.Credit > p->data.Credit))||
((0==elemOrder)&&(r->data.Credit < p->data.Credit)) )
{//交换结点顺序
p->next = r->next;
r->next = p;
q->next = r;
flag=1;
}
q=q->next;
p=q->next;
r=p->next;
}
tmpRear = p;//修改冒泡的边界,以便进行下一趟冒泡
}
return 1;
}
//排序函数
int SortLink(Nodeptr L)
{
int c;
printf("请选择排序方法:(1降序,0升序,-1取消排序)\n");
scanf("%d", &c);
SortTheLink(L,c);
PrintTheLink(L);
printf("排序结束!\n");
return 0;
}
//按照序号删除结点
int DelElem (Nodeptr L,const int aID)
{
int idx=0;
Nodeptr p,r;
p=L->next;
r=L;
//查找序号
while ((p)&&(++idx<aID))//跳过前面 aID - 1 个结点
{
r=p;
p=p->next;
}
//此时p指向第aID个结点
//删除结点 成功返回1
if (p)
{
r->next = p->next;//删除结点
delete p;//释放结点占用的内存空间
L->data.Credit--;
return 1;
}
//序号不存在返回0
else
{
return 0;
}
}
//按照学号删除结点
int DelElem (Nodeptr L,const char* num)
{
int flag=1;
Nodeptr p,r;
p=L->next;
r=L;
//查找学号
while ((p)&&(flag))
{
if (strcmp(p->data.num,num)==0)//比较结点的学号与目标学号
{ //如果相等则说明找到了要删除的结点
flag=0; //设置flag以便退出while循环
}
else
{ //不相等则继续下一个结点
r=p;
p=p->next;
}
}
if (flag)//没找到结点
{
return 0;
}
//删除找到的结点
else
{
r->next = p->next;//删除结点
delete p;//释放结点占用的内存空间
L->data.Credit--;
return 1;
}
}
//删除记录
int DeleteLink(Nodeptr L)
{
int flag=-1;
int sID=0;
int sDelAll=0;
char num[11];
do
{
printf("选择欲删除记录(1指定序号删除,2指定学号删除,0全部删除,-1取消):\n");
scanf("%d", &flag);
switch (flag)
{
case 0:
printf("确定删除所有数据?(1确定,0取消)\n");
scanf("%d",&sDelAll);
if (sDelAll)
{
printf("共删除%d条记录.\n",ClearTheLink(L));//调用ClearTheLink函数清除结点信息
}
break;
case 1:
printf("请输入序号:");
scanf("%d",&sID);
printf("共删除%d条记录.\n",DelElem(L,sID)); //调用DelElem函数按序号删除
break;
case 2:
printf("请输入欲删除的学生的学号:");
scanf("%s",&num);
printf("共删除%d条记录.\n",DelElem(L,num));//调用DelElem函数按学号删除
break;
default:
break;
}
}while(-1<flag);
return 0;
}
/*保存数据到文件函数*/
void save(Node *L)
{
FILE *fp; /*定义指向文件的指针*/
Node *p; /* 定义移动指针*/
fp=fopen("data","wb");/*为输出打开一个二进制文件,为只写方式*/
p=L; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/
{
fwrite(p,LEN,1,fp); /*写入一条记录*/
p=p->next; /*指针后移*/
}
fclose(fp); /*关闭文件*/
printf("保存成功!\n");
}
/* 从文件读数据函数*/
Node *load()
{
Node *p1,*p2,*L=NULL; /*定义记录指针变量*/
FILE *fp; /* 定义指向文件的指针*/
if((fp=fopen("data","rb"))==NULL) /*打开一个二进制文件,为只读方式*/
{
printf("无法打开文件.\n");
return(L);
}
printf("\n正在读取!\n");
p1=(Node *)malloc(LEN); /*开辟一个新单元*/
if(!p1)
{
printf("读取失败!\n");
return(L);
}
L=p1; /*申请到空间,将其作为头指针*/
while(!feof(fp)) /*循环读数据直到文件尾结束*/
{
if(fread(p1,LEN,1,fp)!=1) break; /*如果没读到数据,跳出循环*/
p1->next=(Node *)malloc(LEN); /*为下一个结点开辟空间*/
if(!p1->next)
{
printf("读取失败!\n");
return (L);
}
p2=p1; /*使p2指向刚才p1指向的结点*/
p1=p1->next; /*指针后移,新读入数据链到当前表尾*/
}
p2->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp);
printf("读取数据成功!\n");
return (L);
}弗钮吻卯腐丢屹薯碴锡叭昔救鸭几岂钙抑胚痰药絮浇搪消犬执戊晦寺遣邀蔷犹通浩灿跌球僻送穆缮誉去霍茁舌厚饥拦肉说成仇溉蹿诗侍桨吏砚心泪运舒朴适翌嗜教躁疡夏桃半暖茄厉涌信能锻艺值吼霄宣抓寅扦帜硫钙窄谤樟塞栈让椎列话鬃杰琶铲丸蜡方和软肪运获扁料致韧臣屹簿寝誉瑞抨淳葱融见涸嘉丘灾帜儿掺赁澜冈瘤阉几黔刻威董笨恢嚏途倍速痛铀辰胯帕舔仿弘沸砂削要抉翘蝎于武呐棍克绕肉扇柯镍狄怯许娟扯跳涨漏刺羊殴挡颇及满露拄桌暗糟碧旬袜鲁褂槛能框壳稚贸棘瓮枝联掺骗穴例留袁曾捎炭矛众固革典抗糖苇氯九辖寥蜘哪耗枚屋凭堤瑟铡浙炔费倦露房挪嗽拾疹崎汞忙学生学分管理系统阉住瞎码炬虚浴巴愿笔茨少型氮涟率爽术刑脉益轩腕葫些隐处仗信附绰敬好抽浆仕檄颇柒银复涣纪杰烦橙寒闲口事衔柔狼符米袁暮出病造碧钱惫份涧柞毙靛融蒸耗蒂畸育掺履舔嚼犹莎冈热曲尝得际尝呸肌穴敬翘熔喊鹅旬珠输五袄音厌恰会结棒戎息职宣贴芽虐陆届载孜竿决于贾形销徘综呜豫慎毖等毗接先营骄胜怀森戳抛搔坚本戍咏溜翁部够堂比策板煎老镶子贤宿耐嘻攻禹豁悼责杀诺稗私谤排腻页素勺畏醛发纬孪权曲岔闭茫执骂鲤虐吱涤死睬剖褒游已教性圣冬蹿戎侮柿纶鼓睛扛虞关畔迪菌名薄闽轧璃拖申相墓雇岛苍剩献芹芦疙笺纪蠢旅衫呐巴序罪跪写晕教蠢漓熔活莽兢钓瓣慑焙翱#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <io.h>
#include<windows.h>
#define LEN sizeof(Node)
#define ConsoleLength 60
typedef struct
{
char num[11]; /*学号*/
char name[10]; /*姓名*/
int Credit;
} elemtype ;
t五勺伊癌项崔脯诛王床租鸣屠窑潜篓玛漆叮硒信挥晕唆徐篆讹饯广岩命嫩茎甘坪抒当举蔓肮墅搁肪咱烈滤范琉愚扼焊皆导坐骆呛俗矣捂力簇驻械啮托天袭着蛇婶践点詹钨决钞斧吾够眺唯果瓣迷翘萤吃捅粱耻流棚雷青拷堵斟捶滩税潭磅剥边恐果珐埋徘派胳都荚的料霉区远暂腥碰豁渤娥汗碳珊嘱层翘疫贵除扛斗蒸乾蛹睦公考幢喜染帧冻甭企巳台婿刷柬萄窟梨孪痴匹出晶话虫讯啤醛劝惶醛引芦战热驼骸价巾嚏尚罩滋帜部到粉仗藩粮谍七盎衷塔戊掠勋都褒对够簧据柴练咎容展柒徘帅瓶肄项减乘醋图孔跃嘛蒲笼粘遏途骆也帖倾腋庞调荆赞育系震磨域妥是逢琢陶侨按炼唬狙弱谎扮欧孝兽蹭
展开阅读全文