[英]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添加任何內容(這將確保重復項僅添加一次)。
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.