void sort(struct id *t,int n){ for(int i = 1;i < n;i++) for(int j = 1;j <= n-i;j++) if(strcmp(t[j].name,t[j+1].name)>0) swap(&t[j],&t[j+1]);}解读一下这段代码
时间: 2023-06-24 14:03:21 浏览: 101
这段代码实现了一个结构体数组 `t` 的按照姓名字典序排序的函数。
函数接受两个参数:一个结构体指针 `t` 和一个整数 `n`,表示结构体数组的大小。
函数采用冒泡排序算法,对结构体数组进行排序。具体地,使用两个嵌套的循环,外层循环控制轮数,内层循环控制比较和交换操作。在每一轮内层循环中,比较相邻的两个结构体的姓名,如果前者大于后者,则交换它们的位置。这样,每轮循环都可以将一个未排序的最大元素移到数组末尾。
在比较姓名大小时,使用 `strcmp` 函数进行字符串比较。如果字符串 `t[j].name` 的字典序大于字符串 `t[j+1].name` 的字典序,则执行交换操作。函数 `swap` 被调用,用于交换两个结构体变量的值。
这个排序函数的时间复杂度为 $O(n^2)$,不适用于处理大规模数据。
相关问题
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> struct id { char name[10]; int num; int len; }ID[100]; void swap(struct id* a, struct id* b) { struct id c = *a; *a = *b; *b = c; } void sort(struct id* t, int n) { for (int i = 1; i < n; i++) { for (int j = 1; j < n - i; j++) if (strcmp(t[j].name, t[j + 1].name) > 0) swap(&t[j], &t[j + 1]); } } int main() { int n; int l; scanf("%d", &n); for (int i = 0; i <=n; i++) { scanf("%s%d", ID[i].name, &ID[i].num); ID[i].len = strlen(ID[i].name); } sort(ID, n); for (int i = 0; i <n; i++) { for (int j = 0; j <= ID[i].len; j++) { printf("%c", ID[i].name[j]); } printf(" %d", ID[i].num); printf("\n"); } return 0; }这个代码哪里错了
这个代码有两个问题:
1. 在读入数据时,应该是从 0 到 n-1 进行循环,而不是从 0 到 n。
2. 排序时,应该是从 0 到 n-i-1 进行循环,而不是从 1 到 n-i。
以下是修改后的代码:
```c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
struct id {
char name[10];
int num;
int len;
}ID[100];
void swap(struct id* a, struct id* b) {
struct id c = *a;
*a = *b;
*b = c;
}
void sort(struct id* t, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++)
if (strcmp(t[j].name, t[j + 1].name) > 0)
swap(&t[j], &t[j + 1]);
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s%d", ID[i].name, &ID[i].num);
ID[i].len = strlen(ID[i].name);
}
sort(ID, n);
for (int i = 0; i < n; i++) {
for (int j = 0; j <= ID[i].len; j++) {
printf("%c", ID[i].name[j]);
}
printf(" %d\n", ID[i].num);
}
return 0;
}
```
注意,这里在输出时,应该要在数字后面加上换行符,否则会导致格式错误。
int SortList(struct student *head) // 按总分成绩排序学生信息(降序) { // 冒泡排序 int count = 0; struct student *p, *q, *temp; temp = (struct student *)malloc(sizeof(struct student)); int length = 0; p = head->next; for ( p != NULL; p = p->next) { length++; //记录表长 } for (int i = 0; i < length - 1; i++) { for (p = head->next; p->next != NULL; p = p->next) { q = p->next; if ((p->sum) < (q->sum)) //排序 { *temp = *p; *p = *q; *q = *temp; } } } free(temp); printf("按总成绩降序排行:\n"); TraverseList(head); }
在这段代码中,有一个错误:在第10行的 for 循环中,判断条件写错了,应该是 `p != NULL` 而不是 `for ( p != NULL; p = p->next)`。下面是修改后的代码:
```
int SortList(struct student *head) // 按总分成绩排序学生信息(降序)
{
// 冒泡排序
int count = 0;
struct student *p, *q, *temp;
temp = (struct student *)malloc(sizeof(struct student));
int length = 0;
p = head->next;
while (p != NULL) //修改此处循环条件
{
length++; //记录表长
p = p->next;
}
for (int i = 0; i < length - 1; i++)
{
for (p = head->next; p->next != NULL; p = p->next)
{
q = p->next;
if ((p->sum) < (q->sum)) //排序
{
*temp = *p;
*p = *q;
*q = *temp;
}
}
}
free(temp);
printf("按总成绩降序排行:\n");
TraverseList(head);
}
```
另外,建议在函数结束时加上 return 语句,虽然这个函数返回类型是 void,在函数结尾加上 `return 0;` 可以让代码更规范。
阅读全文