C程序设计 (第四版) 谭浩强 习题9.10
习题 9.10 已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。
IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块:
由于链表并没有说明是有序排列,所以有可能是混乱排序,需要对链表的学号和成绩进行排序,先对两个链表合并,然后利用选择排序对每个结点的学号和成绩进行置换排序。
#include <stdio.h>
#include <stdlib.h>
typedef struct Student{
int num;
float score;
Student *next;
}Student;
void initialStu(Student **stu1, Student **stu2){
*stu1 = (Student*)malloc(sizeof(Student));
*stu2 = (Student*)malloc(sizeof(Student));
}
void creat(Student *stu){
Student *head = stu;
head->next = NULL;
printf("Enter student number: ");
scanf("%d", &head->num);
while(head->num <= 0){
printf("Number can't less than or equal zero! Retry!\nEnter Student number: ");
scanf("%d", &head->num);
}
Student *p1 = head;
Student *p2 = head;
for(int i = 0; i < stu->num; i++){
p1 = (Student*)malloc(sizeof(Student));
p1->next = NULL;
printf("Enter No.%d student number(100 ~ 999): ", i + 1);
scanf("%d", &p1->num);
while(p1->num < 100 || p1->num > 999){
printf("Number Error! Retry!\nEnter No.%d student number(100 ~ 999): ", i + 1);
scanf("%d", &p1->num);
}
printf("Enter No.%d student score(0 ~ 100): ", i + 1);
scanf("%f", &p1->score);
while(p1->score < 0 || p1->score > 100){
printf("Score Error! Retry!\nEnter No.%d student score(0 ~ 100): ", i + 1);
scanf("%f", &p1->score);
}
p2->next = p1;
p2 = p1;
}
printf("\n");
}
void inputStu(Student *stu1, Student *stu2){
printf("Enter Linklist A:\n");
creat(stu1);
printf("Enter Linklist B:\n");
creat(stu2);
}
void output(Student *stu){
for(Student *p = stu->next; p != NULL; p = p->next){
printf("Number: %-3d Score: %-6.2f\n", p->num, p->score);
}
}
void outputStu(Student *stu1, Student *stu2){
printf("\nLinklist A Student info:\n");
output(stu1);
printf("\nLinklist B Student info:\n");
output(stu2);
}
void mergeAscendingSort(Student *stu1, Student *stu2){
Student *temp = (Student*)malloc(sizeof(Student));
temp->num = stu1->num + stu2->num;
temp->next = NULL;
Student *p, *q;
for(p = stu1; p->next != NULL; p = p->next);
p->next = stu2->next;
temp = stu1;
int tempNum;
float tempScore;
for(p = temp->next; p != NULL; p = p->next){
for(q = p->next; q != NULL; q = q->next){
if(p->num > q ->num){
tempNum = p->num;
p->num = q->num;
q->num = tempNum;
tempScore = p->score;
p->score = q->score;
q->score =tempScore;
}
}
}
printf("\nMerge Student info:\n");
output(stu1);
}
int main(){
Student *stu1 = NULL;
Student *stu2 = NULL;
initialStu(&stu1, &stu2);
inputStu(stu1, stu2);
outputStu(stu1, stu2);
mergeAscendingSort(stu1, stu2);
free(stu1);
free(stu2);
system("pause");
return 0;
}