{ p=p->next; q=p1; p1=p1->next; while(p!=NULL) { i=1; while(p1!=NULL) { if(strcmp(p->specialty,p1->specialty)==0) { q->next=p1->next; p1->next=p->next; p->next=p1; q=p1; p1=p1->next; i=i+1; } else { p1=p1->next; q=q->next; } } for(;i>0;i--) { p=p->next; } p1=p->next; q=p; } q=head; while(q!=NULL) { printf("专业:%s,学号:%d ,姓名:%s,性别: %s,年龄: %d,籍贯:%s,系别: %s,班级:%d,学籍变化:%s\n", q->specialty,q->id,q->name,q->gender,q->age,q->native_place,q->department,q->cla,q->xjbh); q=q->next; } printf("输出完成!\n"); }这段代码是我想对一个链表按专业排序,请在这段代码上进行改进
时间: 2023-12-03 07:47:13 浏览: 75
对于这段代码,我有以下几点建议:
1. 首先,需要在开始时检查链表是否为空,如果为空则直接返回。
2. 在对专业进行比较时,可以使用 strcmp 函数,而不是自己实现比较函数,这样可以使代码更简洁。
3. 在交换节点时,可以使用一个临时指针变量,直接交换两个节点,而不需要改变节点的顺序。
4. 在输出时,可以使用循环变量来记录当前节点的位置,而不需要重新遍历整个链表。
改进后的代码如下:
```c
void sortBySpecialty(Student *head) {
if (head == NULL || head->next == NULL) {
printf("链表为空!\n");
return;
}
Student *p, *q, *p1, *tmp;
int i;
p = head->next;
while (p != NULL) {
p1 = p->next;
q = p;
while (p1 != NULL) {
if (strcmp(p->specialty, p1->specialty) > 0) {
tmp = p1->next;
p1->next = p->next;
p->next = p1;
q->next = tmp;
p1 = tmp;
} else {
p1 = p1->next;
q = q->next;
}
}
p = p->next;
}
q = head->next;
i = 1;
while (q != NULL) {
printf("第%d个学生:专业:%s,学号:%d ,姓名:%s,性别: %s,年龄: %d,籍贯:%s,系别: %s,班级:%d,学籍变化:%s\n", i,
q->specialty, q->id, q->name, q->gender, q->age, q->native_place, q->department, q->cla, q->xjbh);
q = q->next;
i++;
}
printf("输出完成!\n");
}
```
注意,这里的 Student 结构体及其相关函数需要根据具体情况进行定义和实现。
阅读全文