对一个存储学生信息的单向链表,按照学号升序对链表进行排序,每个节点包含了一个学生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; } } }



    推荐阅读