对一个存储学生信息的单向链表,按照学号升序对链表进行排序,每个节点包含了一个学生ID

1.	问题描述: 
(1)建立单向链表,每个结点包括:学号,姓名,性别。(2)按照学号对该链表进行升序排序,要求采用冒泡法,而后进行输出。在主函数中分别调用创建、排序和输出函数。2.	问题的解决方案:根据问题描述,首先创建链表,不仅要给各个结点输入数据,更重要的是要建立起前后结点相互联结的关系。可同时设置3个指针变量,head、p、q,它们都是结构类型的指针,分别代表表头、新建结点和表尾结点。使用new操作符开辟新的存储空间,用来存放新结点。而后对该链表进行升序排列,排序时指针要进行互换,没有数据交换时进行结点的访问。四、主要技术问题的描述根据三的分析,主要问题在于链表的创建以及排序过程中指针的指向。如需要创建N=5个结点,if(i==1)    head=p1;     //将链表中第一个新建结点作为表头elsep2->next =p1;p2=p1;p1=new(STUDENT);cin>>p1->stu_number >>p1->name >>p1->sex >>p1->age;    p2->next =NULL;   //最后一个结点的next成员不指向任何结点排序时,设置三个结构指针m、s、p来记录位置,m=head;	p=head->next;	s=p->next;若不需要交换,指针依次向后移动:m=p; p=s;s=s->next;如果需要进行交换,则:p->next=s->next;     s->next=p;m->next=s;m=s;s=p->next;将两个非递减的链表合并成一个新的非递减的链表。

#include <iostream>
#include <string>
using namespace std;
typedef struct node
{
char ID[20];
char name[30];
char gender[10];
int age;
node *next;
}student;
void print(student *head)
{
student *p=head;
while(p->next != NULL)
{
cout<<p->next->ID<<" "<<p->next->name<<" "<<p->next->gender<<" "<<p->next->age<<endl;
p=p->next;
}
cout<<endl;
}
void create(student *head)
{
cout<<"请依次输入学生的学号 姓名 性别 年龄,输入学号为#时结束"<<endl;
char ID[20];
student *p=head;
while(1)
{
cin>>ID;
if(strcmp(ID,"#")==0)
break;
student *q=new student();
strcpy(q->ID,ID);
cin>>q->name>>q->gender>>q->age;
q->next=p->next;
p->next=q;
p=q;
}
cout<<"链表创建完成!"<<endl<<endl;
}
void sort(student *head)
{
student *m=head;
if(head->next==NULL || head->next->next==NULL)
{
cout<<"链表排序完成!"<<endl<<endl;
return;
}
student *p=head->next;
student *s=p->next;
student *k=NULL;
while(k != head->next->next)
{
while(s!=k)
{
if(strcmp(p->ID,s->ID) > 0)
{
p->next=s->next;     
s->next=p;
m->next=s;
m=s;s=p->next;
}
else
{
m=p;
p=s;
s=s->next;
}
}
k=p;
m=head;
p=m->next;
s=p->next;
}
cout<<"链表排序完成!"<<endl<<endl;
}
int main()
{
int order;
student *head=new student();
head->next=NULL;
while(1)
{
cout<<"请输入命令序号:"<<endl<<"1.创建链表"<<endl<<"2.排序链表"<<endl<<"3.输出链表"<<endl<<"4.退出"<<endl;
cin>>order;
switch(order)
{
case 1:create(head);break;
case 2:sort(head);break;
case 3:print(head);break;
case 4:return 0;
}
}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章