首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将两个已排序的名称数组合并到一个新数组中,消除重复项(C语言)

将两个已排序的名称数组合并到一个新数组中,消除重复项(C语言)
EN

Stack Overflow用户
提问于 2013-11-06 05:38:47
回答 1查看 286关注 0票数 0

我需要合并两个排序的名字文件为一个文件的名称,消除任何重复的名称。

例如:

列表1:

阿什利

詹姆斯

凯文

佐伊

列表2:

伊夫林

詹姆斯

卡尔文

韦恩

列表3:

阿什利

伊夫林

詹姆斯

卡尔文

凯文

韦恩

佐伊

到目前为止,我的函数是这样的:

代码语言:javascript
运行
复制
void funcmerge(char list1[][10], char list2[][10], char list3[][10])
{

}

List1是放入字符串数组中的第一个名称列表。

List2是放入字符串数组中的第二个名称列表。

List3是从List1和List2合并的没有重复名称的列表。

EN

回答 1

Stack Overflow用户

发布于 2013-11-06 07:05:11

我建议为此解决方案修改合并排序的合并部分。创建两个计数器,每个列表一个。这两个计数器将保存各自数组的当前位置。然后,

  • 比较每个列表中的两个当前元素,
  • 将词汇表中较小的元素添加到list3中,
  • 增加包含较小元素的列表的计数器。
  • 重复,直到到达数组的末尾。
  • 将其他数组的其余部分添加到list3中。

如果两个元素在任何时候相等,则只增加一个计数器,而不向list3添加任何内容(这将确保只添加一次重复项)。

代码语言:javascript
运行
复制
void funcmerge(char *list1[], char *list2[], char *list3[])
{
    int i = 0, k = 0, cnt = 0;

    // while both lists still contain elements
    while(list1[i] && list2[k]){
        int cmp = strcmp(list1[i], list2[k]);

        // if the names are equal, don't add anything to the list
        if (cmp == 0){
            k++;

        } else if (cmp < 0){
            list3[cnt++] = list1[i++];

        } else {
            list3[cnt++] = list2[k++];
        }
    }


    // if list1 still has elements, finish adding it to the list
    if (list1[i]){
        while (list1[i]){
            if (strcmp(list3[cnt - 1], list1[i])){
                list3[cnt++] = list1[i++];

            } else{
                i++;
            }
        }
    }

    // if list2 still has elements, finish adding it to the list
    if (list2[k]){
        while(list2[k]){
            if (strcmp(list3[cnt - 1], list2[k])){
                list3[cnt++] = list2[k++];

            } else{
                k++;
            }
        }
    }
}

但是,您应该注意到,我更改了函数的签名,并在数组以空字符结尾的情况下实现了该算法。也就是说,

代码语言:javascript
运行
复制
 char *list1[] = {"Ashley", "James", "Kevin", "Zoe", '\0'};
 char *list2[] = {"Evelynn", "James", "Kalvin", "Wayne", '\0'};

如果列表没有以空字符结尾,则需要将数组长度硬编码到代码中(我不建议这样做),或者用两个数组的长度传递另外两个参数。

最后,您还需要获得list3的大小。我可以想出两种方法来解决这个问题。一种方法是返回list3的大小。只需将return cnt;添加到函数的末尾即可。或者第二,预先将整个数组设置为null (我将使用memset())。然后,您可以遍历数组,直到到达空元素为止。

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

https://stackoverflow.com/questions/19804896

复制
相关文章

相似问题

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