#include
#include
typedef struct{
long id;
char name[10];
char sex[2];
}PS;
int delet(PS* p1, int m, PS* p2, int n);
int merge(PS* p1, int m, PS* p2, int n);
void sort(PS* p, int n);
void display(PS* p, int n);
int delet(PS* p1, int m, PS* p2, int n) {
int i, j;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
if (p1[i].id == p2[j].id)
p1[i] = p1[i + 1];
m--;
}
}display(p1, m);
return m;
}
int merge(PS* p1, int m, PS* p2, int n) {
int i, j;
PS temp;
m = 6;
for(j=0;jfor (i = 0; i < m; i++) {
if (p1[i].id == p2[j].id)
break;
else
i++;
if (i == m) {
m++;
p1[m] = p2[j];
break;
};
}
}
for (i = 0; i < m; i++) {
if (p1[i].id > p1[i + 1].id) {
temp = p1[i];
p1[i] = p1[i + 1];
p1[i + 1] = temp;
}
};
display(p1, m);
return m;
}
void sort(PS* p, int n) {
int i, j;
PS temp;
for (j = 0; j < n - 1; j++) {
for (i = 0; i < n; i++) {
if (strcmp(p[i].sex, p[i + 1].sex) > 0) {
temp = p[i];
p[i] = p[i + 1];
p[i + 1] = temp;
}
if (strcmp(p[i].sex, p[i + 1].sex) == 0) {
if (strcmp(p[i].name, p[i + 1].name) > 0) {
temp = p[i];
p[i] = p[i + 1];
p[i + 1] = temp;
};
};
};
}; display(p, n);
}
void display(PS * p, int n){
int i;
printf("%s:\n", *p);
printf("ID NAME SEX\n");
for (i = 0; i < n; i++) {
printf("%ld%7s%5s\n", p[i].id, p[i].name, p[i].sex);
};
}
int main() {
int m=5, n=2;
PS a[] = { {101, "tom","m"}, {103,"mary","f"}, {104,"mark","m"},
{105,"julia","f"},{106, "sara","f"} };
PS b[] = { {102, "mark","m"},{104,"mark","m"} };
display(a, m);
display(b, n);
delet(a,m,b,n);
merge(a,m,b,n);
sort(a,m);
}
#include<stdio.h>
#include<string.h>
typedef struct{
long id;
char name[10];
char sex[2];
}PS;
int delet(PS* p1, int m, PS* p2, int n);
int merge(PS* p1, int m, PS* p2, int n);
void sort(PS* p, int n);
void display(PS* p, int n);
int delet(PS* p1, int m, PS* p2, int n) {
int i, j, num = 0;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
if (p1[i].id == p2[j].id)
{num++;
m--;
}
p1[i] = p1[i + num];
}
}display(p1, m);
return m;
}
int merge(PS* p1, int m, PS* p2, int n) {
int i, j;
PS temp;
for(j=0;j<n;j++){
p1[m+j] = p2[j];
};
m += n;
display(p1, m);
return m;
}
void sort(PS* p, int n) {
int i, j;
PS temp;
for (j = 0; j < n - 1; j++) {
for (i = j+1; i < n; i++) {
if (strcmp(p[j].sex, p[i].sex) > 0) {
temp = p[j];
p[j] = p[i];
p[i] = temp;
}
if (strcmp(p[j].sex, p[i].sex) == 0) {
if (strcmp(p[j].name, p[i].name) > 0) {
temp = p[j];
p[j] = p[i];
p[i] = temp;
};
};
};
}; display(p, n);
}
void display(PS* p, int n){
int i;
printf("%s:\n", p);
printf("ID NAME SEX\n");
for (i = 0; i < n; i++) {
printf("%ld%7s%5s\n", p[i].id, p[i].name, p[i].sex);
};
}
int main() {
int m=5, n=2;
PS a[] = { {101, "tom","m"}, {103,"mary","f"}, {104,"mark","m"},
{105,"julia","f"},{106, "sara","f"} };
PS b[] = { {102, "mark","m"},{104,"mark","m"} };
display(a, m);
display(b, n);
m = delet(a,m,b,n);
m = merge(a,m,b,n);
sort(a,m);
}
请问是什么问题
merge函数内对m=6;这个赋值越界了,你传的实参a原来只有5个元素。27行改成 m=m-1;
1.delet 函数中,在匹配到相同的 id 时,p1[i] 被赋值为 p1[i+1],而没有对其进行整体移位,导致最后结果中会有重复或者空元素。
2.merge 函数中,在每次执行完循环之后,i 的增加没有被放到循环内部,导致循环无法正常终止。此外,在某一个极端情况下,当 i 增加到 m 时,其增加后的值也将会被用于数组访问,造成内存溢出。
3.sort 函数中,当 strcmp 函数的返回值为 0 时,应该进行按名称排序,但是这里没有进行排序。
4.display 函数中,输出标题行时使用了 *p,但它应该是一个字符串,而不是指针。
5.在 main 函数中,定义了数组 a 和 b 的长度,但并没有使用它们来调用 display 函数。
以上是代码中存在的一些错误。
这是您代码的调试,亲测,调试后可运行:
int delet(PS* p1, int m, PS* p2, int n) {
int i, j;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
if (p1[i].id == p2[j].id) {
int k;
for (k = i; k < m - 1; k++) {
p1[k] = p1[k + 1];
}
m--;
break;
}
}
}
display(p1, m);
return m;
}
2.在函数merge()中,m的值被硬编码为6,这是不正确的。 相反,该值应在合并后更新。 这是更正后的版本:
int merge(PS* p1, int m, PS* p2, int n) {
int i, j;
PS temp;
for (j = 0; j < n; j++) {
for (i = 0; i < m; i++) {
if (p1[i].id == p2[j].id) {
break;
}
else if (i == m - 1) {
m++;
p1[m - 1] = p2[j];
break;
}
}
}
for (i = 0; i < m - 1; i++) {
if (p1[i].id > p1[i + 1].id) {
temp = p1[i];
p1[i] = p1[i + 1];
p1[i + 1] = temp;
}
}
display(p1, m);
return m;
}
3.在sort()函数中,外层循环应该迭代n-1次,而不是n次。 这是更正后的版本:
void sort(PS* p, int n) {
int i, j;
PS temp;
for (j = 0; j < n - 1; j++) {
for (i = 0; i < n - 1; i++) {
if (strcmp(p[i].sex, p[i + 1].sex) > 0) {
temp = p[i];
p[i] = p[i + 1];
p[i + 1] = temp;
}
else if (strcmp(p[i].sex, p[i + 1].sex) == 0) {
if (strcmp(p[i].name, p[i + 1].name) > 0) {
temp = p[i];
p[i] = p[i + 1];
p[i + 1] = temp;
}
}
}
}
display(p, n);
}
4.函数display()中,第一个printf语句不正确。
1.函数 delet 中的删除方法不正确。应该把匹配的数据向前移动,而不是覆盖。
2.函数 delet 中的 m 变量在循环过程中没有正确减小。
3.函数 merge 中的第 6 行,将 m 设置为 6 就相当于把原来的数据覆盖掉,这不符合题意。
4.函数 merge 中的内层循环有问题,如果匹配的数据不在第一位,在内层循环的结尾应该将 i 加 1,而不是加在判断语句之前。
5.函数 sort 中的排序方法存在问题。如果性别不同,需要交换位置;如果性别相同,则需要比较姓名。
6.函数 display 中的输出格式有问题,应该输出每个数据项的信息,而不是整个数组的信息。
不知道你这个问题是否已经解决, 如果还没有解决的话: