Вам не нужно удалять несколько вхождений , но для суммирования значений, связанных с каждым символом.
Ключ в парах - это просто символ, поэтому возможные значения ограничены, и их можно использовать в качестве индекса в массиве, содержащем сумму связанных значений, и другой, указывающий, использовался ли символ. В случае, если числа, связанные с символом, всегда положительны, возможно иметь только один массив, инициализирующий счет -1.
После того, как по определению итерации по последовательным индексам для записи счетчиков произведут их сортировку по символу.
Например:
#include <stdio.h>
#include <limits.h>
int main()
{
int n, i;
int count[1 << CHAR_BIT] = { 0 };
char used[1 << CHAR_BIT] = { 0 };
/* read inputs */
puts("enter number of couples:");
if ((scanf("%d", &n) != 1) || (n <= 0)) {
fprintf(stderr, "invalid number");
return -1;
}
puts("enter couples");
for (i = 0; i != n; ++i) {
unsigned char c;
int v;
if (scanf(" %c %d", &c, &v) != 2) {
fprintf(stderr, "invalid couple");
return -1;
}
used[c] = 1;
count[c] += v;
}
/* write result */
puts("result :");
for (i = 0; i != (1 << CHAR_BIT); ++i) {
if (used[i])
printf("%c %d\n", (char) i, count[i]);
}
return 0;
}
Некоторые замечания:
- Я не предполагаю, сколько битов в символе, я использую
CHAR_BIT
.
- В формате
" %c %d"
пробел перед %c
позволяет пропустить пробелы / перевод строки
- Я заставляю символ c быть без знака , потому что я использую его как индекс и не хочу рисковать иметь отрицательный индекс
- конечно когда я делаю scanf я проверяю успех
Компиляция и исполнение:
/tmp % gcc -pedantic -Wextra -Wall c.c
/tmp % ./a.out
enter number of couples:
5
enter couples
M 25 A 50
O 70 A 45 L 100
result :
A 95
L 100
M 25
O 70