簡體   English   中英

將兩個排序的名稱數組合並為一個新數組,從而消除重復項(C語言)

[英]Merge two sorted arrays of names into a new array, eliminating duplicates ( C Language )

我需要將兩個排序的名稱文件合並為1個名稱文件,以消除任何重復的名稱。

因此,例如:

清單1:

阿什利

詹姆士

凱文

佐伊

清單2:

伊芙琳

詹姆士

卡爾文

韋恩

清單3:

阿什利

伊芙琳

詹姆士

卡爾文

凱文

韋恩

佐伊


到目前為止,這是我的功能:

void funcmerge(char list1[][10], char list2[][10], char list3[][10])
{

}

List1是放入字符串數組的第一個名稱列表

List2是放入字符串數組的第二個名稱列表

List3是從List1和List2合並的名稱列表,沒有重復項。

我建議為此解決方案修改合並排序的合並部分。 創建兩個計數器,每個列表一個。 這兩個計數器將分別保存各自數組的當前位置。 然后,

  • 比較每個列表中的兩個當前元素,
  • 將按字典順序排列的較小元素添加到list3,
  • 遞增包含較小元素的列表的計數器。
  • 重復直到到達數組的末尾。
  • 將另一個數組的其余部分添加到list3。

如果兩個元素在任何時候都相等,則僅增加一個計數器,並且不對list3添加任何內容(這將確保重復項僅添加一次)。

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++;
            }
        }
    }
}

但是,您應該注意,我更改了函數的簽名,並假設數組以空字符結尾,並且實現了此算法。

 char *list1[] = {"Ashley", "James", "Kevin", "Zoe", '\0'};
 char *list2[] = {"Evelynn", "James", "Kalvin", "Wayne", '\0'};

如果列表不以空字符結尾,則您將需要將數組長度硬編碼到代碼中(我不建議這樣做),或者使用兩個數組的長度傳入另外兩個參數。

最后,您還需要獲取list3的大小。 我可以想到兩種解決方法。 一種方法是返回list3的大小。 只需添加return cnt; 到功能的末尾。 或兩個,事先將整個數組設置為null(我將使用memset() )。 然后,您可以遍歷數組,直到遇到null元素為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM