该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
using namespace std;
//定义学生类
class Student
{
private:
char sn[10];
char name[10];
public:
Student*next;//指针--指向下一个对象结点
Student()
{
next=NULL;
}//无参构造函数,用于创建空对象
Student(char *sn,char*name,Student* next=NULL)//两参构造函数
{
strcpy(this->sn,sn);
strcpy(this->name,name);
}
char * getSn()
{
return sn;
}
char * getName()
{
return name;
}
};
Student* stuList=new Student;//全局变量
Student* rear=stuList;//全局变量
void init();//链表初始化
void show();//显示链表
void app();//为链表追加结点
void save();//用链表更新文件
void sort();//排序-简单选择排序法
void main()
{
cout<
init();//初始化--将文件记录全部建成链表(单链表)
system("PAUSE");
cout<
show();//输出单链表--也就是文件的全部记录
system("PAUSE");
cout<
app();//追加记录给链表--链表尾插入新结点(新对象)
system("PAUSE");
cout<
show();//输出单链表--除了文件的全部记录,还有上面新追加的记录(还没有写入文件,只在链表上)
system("PAUSE");
cout<
sort();
show();//输出单链表--除了文件的全部记录,还有上面新追加的记录(还没有写入文件,只在链表上)
system("PAUSE");
cout<
save();//将单链表的数据,全部写入到文件中。
}
//链表初始化
void init()
{
ifstream ifs("student.txt");
if(!ifs)
{
cout<
exit(0) ;
}
Student* s;
while(!ifs.eof())
{
s=new Student;
if(ifs.read((char*)s,sizeof(Student)-4))
{
rear->next=s;
rear=s;
s->next=NULL;
}
}
ifs.close();//关闭文件
}
//显示数据--输出链表
void show()
{
Student *p=stuList;//指向头结点(带头结点的单链表)
while(p->next!=NULL)
{
p=p->next;
cout<getSn()<getName()<
}
}
void app()
{
//创建对象
char sn[10];
char name[10];
char continueInput;
Student *student;
do
{
cout<>sn;
cout<>name;
student=new Student(sn,name) ;
//对象追加到链表中--尾插法
rear->next=student;
rear=student;
student->next=NULL;
cout<
cin>>continueInput;
}while(continueInput=='Y'||continueInput=='y');
//将文件中的数据读出来(直接用类对象),并输出到屏幕
}
//用链表更新文件内容(洗清空文件,再把链表写入)
void save()
{
ofstream ofs("student.txt",ios::trunc);//如果文件,清空文件
if(!ofs)
{
cout<
exit(0) ;
}
Student * p=stuList;
while(p->next!=NULL)
{
p=p->next;
if(!ofs.write((char*)p,sizeof(Student)-4))
{
cout<
}
}
ofs.close();
}
//链表排序-简单选择排序法(升序)
//排序思想:1.将链表中结点(不包括头结点)分为有序区和无序区,第一轮排序时,有序区为空,全部为无序区
//2.在无序区中找比无序区第一个小的结点,插入到无序区的最前,形成新的有序区和无序区,经过1轮排序
//第一个结点必然是最小的,这样形成有1个结点的有序区和N-1个结点的无序区
//重复第2步,直到无序区只有一个结点
void sort()
{
Student *min,*start,*p;//start指向每轮排序的起点
p=start=stuList;//stuList就是头指针(指向头结点)
while(start->next!=NULL)//如果start指向最后一个结点了,就不用排序了
{
p=start;
//开始新一轮排序前,start指向这轮排序的第一个结点的前一个结点,也就有序区的最后一个结点(便于交换)
//每一轮都假设这轮第一个结点(有序区中)最小的
while(p->next!=NULL)
{
//某一轮中查找比这一轮排序无序区中第一个结点小的结点
if(strcmp(p->next->getSn(),start->next->getSn())==-1)//如果找到更小的,min就指向这个更小的
{
min=p->next;
p->next=p->next->next;//p->next=min->next
min->next=start->next;
start->next=min;
}
if(p->next!=NULL)//考虑最后一个结点的移动,要用if的原因,就是怕p指向了最后一个结点
p=p->next;
else break;
}
printf(“873521803”);//看这里哦!!!
if(start->next!=NULL)//下一轮排序始化
start=start->next;//要用if的原因,就是怕start指向了最后一个结点
}
}