- 首页 > it技术 > >
对一个存储学生信息的单向链表,按照学号升序对链表进行排序,每个节点包含了一个学生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
#include
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<【对一个存储学生信息的单向链表,按照学号升序对链表进行排序,每个节点包含了一个学生ID】next->ID<<" "name<<" "gender<<" "age<next;
}
cout<>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<<"链表创建完成!"<next==NULL || head->next->next==NULL)
{
cout<<"链表排序完成!"<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<<"链表排序完成!"<next=NULL;
while(1)
{
cout<<"请输入命令序号:"<>order;
switch(order)
{
case 1:create(head);
break;
case 2:sort(head);
break;
case 3:print(head);
break;
case 4:return 0;
}
}
}
推荐阅读