2022年2022年链表学生信息管理系统 .pdf
#include#include/定位小数点的头文件setprecision()#include using namespace std;struct List/定义数据结构存取文件里的数据 char name20;char id20;float score2;struct PList/定义链表结构体,如果在 c 语言中务必添加typedef struct来定义一个 PList struct PList*prior;/前一个节点 char name20;char id20;float score2;struct PList*next;/后一个节点;PList*head=NULL,*p,*p1,*p2;char FileName20,Judge;/文件名和判断字符int i,n;/n 学生人数void Create()/创造链表 int j,k;p1=new PList;List*stu=new Listn;/new学生结构体 FILE*fp;fp=fopen(FileName,a+);/附加方式打开,若无则新建一个FileName 的文件 if(fp!=NULL)fseek(fp,0,0);/文件指针挪到起始位置 for(i=0;iname,stui.name);/值传递到链表中strcpy(p-id,stui.id);/值传递到链表中p-score0=stui.score0;/值传递到链表中名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 10 页 -p-score1=stui.score1;/值传递到链表中if(head=NULL)/如果链表头为空 head=p;p1=p;p-prior=NULL;/新 new 出来的为 head 节点(这里 p1 一定要指向 p 或 head,方便下面继续添加链表),头结点的前一节点为NULL else p1-next=p;p-prior=p1;/否则向后添加节点p1=p;p1-next=NULL;/最后 p1-next 为空,表示链表末尾 delete n stu;/释放不需要的空间 void Print()/输出链表数据 p=head;if(p=NULL)/如果 head 为空,标书没有数据 coutThere is no data!endl;else while(p!=NULL)/不为空时显示 couttName:nametID:idtProgram:setprecision(2)fixedscore0tEnglish:setprecision(2)fixedscore1next;/p指向后一个节点 void Insert1()/插入数据 p1=new PList;/新分配 p1 地址 coutp1-name;coutp1-id;coutp1-score0;coutp1-score1;if(head=NULL)/head为空 head=p1;p1-next=NULL;p1-prior=NULL;名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 10 页 -p2=p1;/利用 p2 便于继续添加节点 else/head 不为空是利用 p2 添加节点 p2-next=p1;p1-prior=p2;p1-next=NULL;p2=p1;coutJudge;if(Judge=y|toupper(Judge)=Y)/判断输入是否为y 和 Y,toupper 为转换大写 Insert1();/y 和 Y 继续插入节点,再次进入时将进入insert1 中的 else 语句 else/其他则退出 coutInsert Exit!n;void Insert2()/查找后在该节点(p)前方插入新的节点 p1=new PList;coutp1-name;coutp1-id;coutp1-score0;coutp1-score1;if(p=head)/查找的节点为头结点时 p-prior=p1;p1-next=p;p1-prior=NULL;head=p1;p=head;/new出来的 p1 设为头结点,p(原头节点)的前节点指向 p1,p1 后节点指向 p,然后 head 和 p 重新指向 p1 else/查找的节点非头结点 p2-next=p1;p1-prior=p2;p1-next=p;p-prior=p1;/p2与 p 之间插入 p1 p=p1;/方便继续插入p2 与 p 保持前后节点关系 coutJudge;if(Judge=y|toupper(Judge)=Y)Insert2();else coutInsert Exit!n;名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 10 页 -void Insert3()/查找后在该节点(p)后方插入新的节点 p1=new PList;coutp1-name;coutp1-id;coutp1-score0;coutp1-score1;if(p=head)/如果 p 是头结点 p1-next=p-next;/new出来的 p1-next 节点要指向 p-next 节点 if(p-next!=NULL)/如果 p 的后一节点不为空 p-next-prior=p1;/那必须使它的前一节点指向p1,如果为空那就是NULL 所以不用 p-next=p1;p1-prior=p;p=p1;/p的下一结点给 p1,p1 的前一节点给 p,p 指向 p1(方便继续插入,此时p2 指向 head,p2 和 p 保持前后节点)else/p 为非头结点,在 p 后方插入新节点,此时 p2 为 p 的前节点,需要判断 p 的下一结点是否为空 p2=p;p=p-next;p2-next=p1;p1-prior=p2;p1-next=p;/p2和 p 各向后移动一个节点,在 p2 与 p 之间插入一个 p1 节点 if(p!=NULL)/判断 p 是否为空,也就是刚开始的p-next 是否为空p-prior=p1;/不为空则需要设置前一节点给p1,为空则不需要 p=p1;/利于继续插入节点,保证 p2 与 p 保持前后节点关系 coutJudge;if(Judge=y|toupper(Judge)=Y)Insert3();else coutInsert Exit!n;void Delete()/删除查找到的 p 节点 coutJudge;if(Judge=y|toupper(Judge)=Y)if(p=head&p-next=NULL)/如果是头节点且只有一个节点名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 10 页 -head=NULL;/head为空即可 if(p=head&p-next!=NULL)/如果是头节点且后面有节点 head=p-next;head-prior=NULL;/重新设置头结点为p 的后一节点,使该节点前节点为空 if(p-next!=NULL)/如果不是头结点且后一结点不为空 p-next-prior=p2;/p的后一结点的前节点指向p2(原指向 p)p2-next=p-next;/p2的后一节点指向p 的后一节点(原指向 p)else/如果不是头结点且后一结点为空 p2-next=NULL;/p2的后一节点为空即可 coutDelete Successful!endl;else coutDelete Exit!n;void Alter()/改变信息 coutJudge;if(Judge=y|toupper(Judge)=Y)/y或 Y 重新输入信息,重新赋值给该节点 coutp-name;coutp-id;coutp-score0;coutp-score1;else coutAlter Exit!n;void Search()/查询节点 char SearchID20,SearchName20;int num;p=head;p2=head;if(p=NULL)/头结点为空,则表示无数据 coutThere is no data!;coutJudge;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 10 页 -if(Judge=y|toupper(Judge)=Y)Insert1();else coutFind Exit!endl;else/头结点不为空,则显示要搜索的方式 coutnum;if(num=1)/按名字查询 continue1:coutSearchName;while(p!=NULL&strcmp(p-name,SearchName)!=0)/p不为空,则向后移动一个节点(注:此时p!=NULL 必须放在前面,否则 p 为空是由于 p-name 不存在而出错)p2=p;p=p-next;if(p=NULL)/链表遍历完后没找到该数据 coutCant find the Name!endl;coutJudge;if(Judge=y|toupper(Judge)=Y)Insert1();else/找到该数据时 coutThe info as follow:endlendl;couttName:nametID:idtProgram:setprecision(2)fixedscore0tEnglish:setprecision(2)fixedscore1endlendl;coutWhat do you want?endl;coutt*endlendl;coutt1.Alter This Info!endl;coutt2.Delete This Info!endl;coutt3.Insert A Info Before This!endl;coutt4.Insert A Info After This!endl;couttInput Others Will Exit!endlendl;coutt*endlendl;coutJudge;switch(Judge)case 1:Alter();break;case 2:Delete();名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 10 页 -break;case 3:Insert2();break;case 4:Insert3();break;default:coutExit!endl;break;coutJudge;if(Judge=y|toupper(Judge)=Y)/是否继续搜素?p=head;p2=head;goto continue1;/此时务必要把 p 和 p2 指向头结点,否则上边遍历过得无法再查找 else coutSearch Exit!endl;else if(num=2)/同上,唯一不同是利用ID 查找 continue2:coutSearchID;while(p!=NULL&strcmp(p-id,SearchID)!=0)p2=p;p=p-next;if(p=NULL)coutCant find the ID!endl;coutJudge;if(Judge=y|toupper(Judge)=Y)Insert1();else coutThe info as follow:endlendl;couttName:nametID:idtProgram:setprecision(2)fixedscore0tEnglish:setprecision(2)fixedscore1endlendl;coutWhat do you want?endl;coutt*endlendl;coutt1.Alter This Info!endl;coutt2.Delete This Info!endl;coutt3.Insert A Info Before This!endl;coutt4.Insert A Info After This!endl;couttInput Others Will Exit!endlendl;名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 10 页 -coutt*endlendl;coutJudge;switch(Judge)case 1:Alter();break;case 2:Delete();break;case 3:Insert2();break;case 4:Insert3();break;default:coutExit!endl;break;coutJudge;if(Judge=y|toupper(Judge)=Y)p=head;p2=head;goto continue2;else coutSearch Exit!endl;else coutSearch Exit!;void Save()/保存数据 FILE*fp;p=head;i=0;List*stu=new Listn;/重新 new 出学生结构体 fp=fopen(FileName,w);/打开文件,文件存在重写,不存在则新建后写入 if(head=NULL)/空链表 coutThere is no data need save!name);strcpy(stui.id,p-id);stui.score0=p-score0;stui.score1=p-score1;p=p-next;fwrite(&stui,sizeof(struct List),1,fp);i+;coutSave Successful!endl;delete n stu;/释放不需要的空间 void main()strcpy(FileName,student.txt);/默认文件名 n=100;/默认学生数 Create();/读取文件数据到链表 do system(cls);/清屏 couttWellcome To Students Management System!endl;couttYou Opened FileName is:(FileName)endl;coutt*endlendl;coutt1.Show All The Info!endl;coutt2.Search(Insert,Delete,Alter)Info!endl;coutt3.Save!endl;coutt4.Open Or Create New File!endl;coutt5.Alter The Number of Students!endl;couttInput Others Will Exit!endlendl;coutt*endlendl;coutJudge;switch(Judge)case 1:Print();break;case 2:Search();break;case 3:Save();break;case 4:coutFileName;Create();名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 10 页 -break;case 5:coutn;Create();break;default:coutJudge;if(Judge=y|toupper(Judge)=Y)coutExit!endl;exit(0);/程序正常退出,正常退出时刚才的save 才能起到效果 else break;system(pause);while(1);名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 10 页 -