首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交换结构

交换结构
EN

Stack Overflow用户
提问于 2013-12-25 11:26:24
回答 3查看 81关注 0票数 0
代码语言:javascript
复制
# include <stdio.h>
# include <stdlib.h>

typedef struct
{
int Employee_id;
char Employee_Name[50];
float Employee_salary;

} employee;

void swap(employee *a,employee *b);

int main(int argc,char* argv[])
{
    int n;
    int iter,iter2,iter3,iter4;
    scanf("%d",&n);
    employee *start = (employee *)malloc(n*sizeof(employee));

    employee temp;

    for (iter = 0; iter < n;iter++)
        {
            scanf("%d",&((*(start+iter)).Employee_id));
            scanf("%s",(*(start+iter)).Employee_Name);
            scanf("%f",&((*(start+iter)).Employee_salary));

        }


    //USING BUBBLE SORT TO SORT ON BASIS OF IDS
    for (iter2 = 1; iter2 <=n; iter2++)
    {
        for (iter3 = 0; iter3 <n-iter2 ; iter3++)
        {
            if ((start[iter3]).Employee_id > (start[iter3+1]).Employee_id)
            {
                swap(&start[iter3+1],&start[iter3]);
            }
        }
    }

    //PRINTING
    for (iter4 = 0; iter4 < n; iter4++)
    {
        printf("%d\n",(*(start+iter4)).Employee_id);
        printf("%s\n",(*(start+iter4)).Employee_Name);
        printf("%f\n",(*(start+iter4)).Employee_salary);
        printf("\n");

    }
    free(start);

return EXIT_SUCCESS;
}





void swap(employee  *a,employee *b)
{
employee temp = *a;
*a = *b;
*b = temp;
}

我试图基于employee id交换结构,当我试图交换程序突然终止的结构时,我在compilation.But上没有错误。对于ints和其他基本类型,相同的交换很好用,但是对于帮助来说,structs.Thanks就不行了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-25 11:36:19

在您的for循环中进行排序。

代码语言:javascript
复制
for (iter2 = 0; iter2 <n; iter2++)
{
    for (iter3 = 0; iter3 <n-iter2 ; iter3++) //LINE A
    {
        if ((start[iter3]).Employee_id > (start[iter3+1]).Employee_id)
        {
            swap(&start[iter3+1],&start[iter3]);
        }
    }
}

在A行,当iter2为0时,内环将从0到n-1.当iter3n-1时,您将在n访问一个项,这将导致未定义的行为(超出绑定索引)。

因此,请按以下方式更改代码:

代码语言:javascript
复制
for (iter2 = 0; iter2 <n; iter2++)
{
    for (iter3 = 0; iter3 <n - 1 -iter2 ; iter3++)
    {
        if ((start[iter3]).Employee_id > (start[iter3+1]).Employee_id)
        {
            swap(&start[iter3+1],&start[iter3]);
        }
    }
}

请确保在循环的任何迭代中,都不应该没有绑定访问。

票数 3
EN

Stack Overflow用户

发布于 2013-12-25 11:30:21

请注意这一行,在这里使用n而不进行初始化。

代码语言:javascript
复制
employee *start = malloc(n*sizeof(employee));

要解决这个问题,您需要交换这两行:

代码语言:javascript
复制
employee *start = malloc(n*sizeof(employee));
scanf("%d",&n);

此外,您需要在这里添加显式类型转换,将该行更改为:

代码语言:javascript
复制
employee *start = (employee *)malloc(n*sizeof(employee));

编辑swap()没有问题。请参见以下测试:

代码语言:javascript
复制
employee a, b;
a.Employee_id = 1;
a.Employee_Name[0] = 'a';
a.Employee_salary = 10.0;
b.Employee_id = 2;
b.Employee_Name[0] = 'b';
b.Employee_salary = 20.0;
swap(&a, &b);

在此之后,a.Employee_id=2b.Employee_id=1等。

票数 3
EN

Stack Overflow用户

发布于 2013-12-25 11:38:28

这条线

代码语言:javascript
复制
swap(&start[iter3+1], ...

start ( iter3==niter2 == 0)访问超出界限的数组iter2 == 0

所以程序会调用未定义的行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20772250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档