【问题标题】:Bubble sort returning multiple identical results冒泡排序返回多个相同的结果
【发布时间】:2020-04-13 00:09:56
【问题描述】:

这是我之前尝试从文件中获取值的上一篇文章的后续内容。我对其进行了一些修改并预先定义了我的排序数组,所以一切都是“排序”的。名称排序在某种意义上是有效的,但是当我输出结果时,我得到了 2-3 次相同的结果,并且没有正确显示所有数据。

我删除了 Struct,因为它只是给我带来了问题,并且卡在了正常的不受控制的数组中。

    // Sort by Name method
    sortByName(hurricanYear, name, state);

    // Output results to screen
    printf("\nName Sort\n\n");
    printf("%-10s%-10s%-10s\n", "Year", "Name", " State");
    for (i = 0; i < MAX_ROWS; i++)
        printf("%-10d%-10s%-10s\n", hurricanYear[i], name[i], state[i]);


/* This function sorts the strings by Name, while
   maintaining stability with its respected data */
void sortByName(int year[], char* name[], char* state[])
{
    int i, n;

    // Loop for row count
    for (i = 0; i < MAX_ROWS; i++)
    {
        // Loops for element count in name array
        for (n = 0; n < i; n++)
        {
            // If name takes precedence over n+1 in array 
            // Copy name string to array
            if (strcmp(name[n], name[n + 1])>0)
            {
                char* pName = name[n];
                strcpy(name[n], name[n + 1]);
                strcpy(name[n + 1], pName);

                // Sort year according to name
                int t = year[n];
                year[n] = year[n + 1];
                year[n + 1] = t;

                // Sort state according to name                
                char* pState = state[n];
                strcpy(state[n], state[n + 1]);
                strcpy(state[n + 1], pState);
            }
        }
    }
}

结果是我所期望的,但名称排序功能却没有。

名称排序

Year      Name       State
1972      Agnes      FL
1969      Agnes      FL
1960      Agnes      FL
1983      Alicia     TX
1992      Andrew     FL-LA
1989      Andrew     FL-LA
2004      Charley    FL-SC-NC
1999      Charley    FL-SC-NC
1995      Charley    FL-SC-NC
2003      Charley    FL-SC-NC
2005      Dennis     FL-AL
2004      Dennis     FL-AL
2004      Dennis     FL-AL
2004      Dennis     FL-AL
2009      Ida        MS
2005      Ida        MS
2005      Ida        MS
2008      Ida        MS
2011      Irene      NC-NJ-MA-VT
2012      Isaac      LA

是我的 for 循环这样做,还是我在我的函数中多次获得 strcpy() 结果?这也是我使用的列表:

1960 Donna Fl-NC
1969 Camille MS
1972 Agnes FL
1983 Alicia TX
1989 Hugo SC-NC
1992 Andrew FL-LA
1995 Opal FL-AL
1999 Floyd NC
2003 Isabel NC-VA
2004 Charley FL-SC-NC
2004 Frances FL
2004 Ivan AL
2004 Jeanne FL
2005 Dennis FL-AL
2005 Katrina FL-LA-MS
2005 Rita TX-LA
2008 Wilma FL
2009 Ida MS
2011 Irene NC-NJ-MA-VT
2012 Isaac LA

【问题讨论】:

  • 我相信您的错误在这里:char* pState = state[n]; 请注意,您只是在复制指针而不是它指向的数据。所以在strcpy(state[n], state[n + 1]); 之后pStatestate[n] 都包含与state[n + 1]) 相同的状态
  • 请提供mcve好吗?我看到你的代码不完整。
  • 旁注:您使用的是“并行”数组(由同一变量索引的多个数组)而不是 struct 的单个数组。请参阅我的 [非常] 最近的答案,其中另一个 OP 具​​有相同的构造,我提供了一种重构它的方法:stackoverflow.com/a/61179379/5382650

标签: c arrays for-loop bubble-sort


【解决方案1】:

Ty Drescherjm 指出了这一点。我设法通过删除指针并用 strcpy() 替换它来修复它

#define MAX 100
void sortByName(int year[], char* name[], char* state[])
{
    int i, n;
    char plh[MAX]; // placeholder

    // Loop for row count
    for (i = 0; i < MAX_ROWS; i++)
    {
        // Loops for element count in name array
        for (n = 0; n < i; n++)
        {
            // If name takes precedence over n+1 in array 
            // Copy name string to array
            if (strcmp(name[n], name[n + 1])>0)
            {
                strcpy(plh, name[n]);
                strcpy(name[n], name[n + 1]);
                strcpy(name[n + 1], plh);

                // Sort year according to name
                int t = year[n];
                year[n] = year[n + 1];
                year[n + 1] = t;

                // Sort state according to name                
                strcpy(plh, state[n]);
                strcpy(state[n], state[n + 1]);
                strcpy(state[n + 1], plh);
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多