你的代码有几个问题需要修改:
1. 在定义 `struct` 结构体时,结构体名字缺少了,应该是类似 `struct Counter{...}` 的形式。
2. 定义结构体变量 `cm` 时缺少了结构体名字,应该是 `Counter cm;`。
3. 为了记录比较次数和移动次数,需要在每次比较或移动操作之后,将 `cm.cpn` 或 `cm.mvn` 加一。
4. 在 `zhijiecharu` 函数中,对 `L.r` 进行了动态内存分配,但是没有进行释放。应该在函数结束前加上 `free(L.r);`。
除了上述问题,你的代码基本实现了直接插入排序,并且统计了比较次数和移动次数。
下面是修复后的代码:#include <stdio.h>#include <stdlib.h>#define MAXSIZE 80 //顺序表的最大长度typedef int KeyType; // 将关键字类型定义为整型typedef int InfoType; // 将其它数据项类型也定义为整型struct Counter { int cpn; //记录比较次数 int mvn; //记录移动次数}; //分别用来记录三种排序的比较和移动次数,并可将此数组定义为全局变量typedef struct { KeyType key; // 关键字项 InfoType otherinfo; // 其它数据项} RedType; // 记录类型typedef struct { RedType *r; //一般情况将r闲置 int length; // 顺序表长度} SqList; //顺序表的类型void zhijiecharu(SqList &L, int n){ int i, j; L.r = (RedType*)malloc(sizeof(RedType) * MAXSIZE); L.length = 0; for (i = 1; i <= n; i++) { scanf("%d", &(L.r[i].key)); } Counter cm = {0, 0}; // 初始化比较次数和移动次数 for (i = 2; i <= n; i++) { if (L.r[i].key < L.r[i-1].key) { L.r[0] = L.r[i]; // 复制为哨兵 L.r[i] = L.r[i-1]; // 后移一个元素 cm.mvn++; for (j = i-2; L.r[0].key < L.r[j].key; --j) { L.r[j+1] = L.r[j]; cm.mvn++; cm.cpn++; } L.r[j+1] = L.r[0]; // 插入到正确位置 cm.mvn++; } else { cm.cpn++; } } printf("排序前的数据序列:"); for (i = 1; i <= n; i++) { printf("%d ", L.r[i].key); } printf("\n"); printf("排序后的数据序列:"); for (i = 1; i <= n; i++) { printf("%d ", L.r[i].key); } printf("\n"); printf("比较次数:%d\n", cm.cpn); printf("移动次数:%d\n", cm.mvn); free(L.r);}
希望对你有帮助!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |