代码详细注释void sort_contacts() { if(head == NULL) { printf("通讯录为空!\n"); } else { Contact *prev = NULL, *cur = head; int is_sorted = 0; while(!is_sorted) { is_sorted = 1; prev = NULL; cur = head; while(cur->next != NULL) { if(strcmp(cur->name, cur->next->name) > 0) { is_sorted = 0; if(prev == NULL) { //移动头结点 head = cur->next; cur->next = head->next; head->next = cur; prev = head; } else { Contact *next = cur->next; prev->next = next; cur->next = next->next; next->next = cur; prev = next; } } else { prev = cur; cur = cur->next; } } } printf("已成功按姓名字母排序!\n"); } }
时间: 2024-02-10 09:08:49 浏览: 72
这是一个用于通讯录排序的函数,以下是函数代码的详细注释:
void sort_contacts() {
// 如果通讯录为空,输出提示信息
if(head == NULL) {
printf("通讯录为空!\n");
} else {
Contact *prev = NULL, *cur = head; // 定义 prev 和 cur 指针
int is_sorted = 0; // 定义排序标志,初值为 0
while(!is_sorted) { // 只要未排序完成,就继续排序
is_sorted = 1; // 初始设置为已排序
prev = NULL; // 重置 prev 指针为 NULL
cur = head; // 重置 cur 指针为头结点
while(cur->next != NULL) { // 遍历链表直到末尾
if(strcmp(cur->name, cur->next->name) > 0) { // 如果当前节点的名字大于下一个节点的名字
is_sorted = 0; // 设置排序标志为未排序
if(prev == NULL) { // 如果当前节点是头结点
head = cur->next; // 移动头结点
cur->next = head->next; // 将当前节点的 next 指向 head 的 next
head->next = cur; // 将 head 的 next 指向当前节点
prev = head; // 将 prev 指针设置为 head
} else { // 如果当前节点不是头结点
Contact *next = cur->next; // 定义 next 指针,指向下一个节点
prev->next = next; // 将 prev 的 next 指向 next
cur->next = next->next; // 将当前节点的 next 指向 next 的 next
next->next = cur; // 将 next 的 next 指向当前节点
prev = next; // 将 prev 指针设置为 next
}
} else { // 如果当前节点的名字小于或等于下一个节点的名字
prev = cur; // 将 prev 指针设置为当前节点
cur = cur->next; // 将 cur 指针移动到下一个节点
}
}
}
printf("已成功按姓名字母排序!\n"); // 输出排序完成的提示信息
}
}
阅读全文