c语言实现链表的排序,用链表实现排序,显示,追加内容。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#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指向了最后一个结点

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值