Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
LingWiloce
0 / 0 / 0
Регистрация: 07.10.2010
Сообщений: 19
#1

Проблема ф-ии сравнения элементов списка - C++

06.11.2011, 15:55. Просмотров 738. Ответов 12
Метки нет (Все метки)

День добрый, вот есть такая загогулина (вроде бы и простая, но я уже всю голову себе разнес):
Есть список, каждый элемент из которого: массив букв (т.е. слово). Необходимо проверить список на одинаковые слова, подсчитав их кол-во. Решил, что будет достаточно такого простенького кода, но, как оказалось, нет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void mission()
{
int k=0;
//char end=0, spec[250];
node *temp, *temp1; 
temp = head; 
while (temp != NULL)
{   
    temp1=temp->next;
    while (temp1 != NULL) 
    {   if(temp==temp1) k++;
    temp1=temp1->next;
    }
    temp=temp->next;
}
cout << "Quantity of special nodes: "<< k;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2011, 15:55     Проблема ф-ии сравнения элементов списка
Посмотрите здесь:

Проблема с функцией создания односвязного списка C++
Проблема с массивом - найти позиции крайних отрицательных элементов C++
Функция заполнения массива и сравнения среднего значения элементов C++
C++ Проблема с классом для линейного списка
Сравнение элементов списка C++
C++ Проблема сравнения данных в массиве с другими данными
C++ Очередь С++ Проблема с удалением элементов класса очереди
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
582 / 520 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
06.11.2011, 16:00     Проблема ф-ии сравнения элементов списка #2
по-моему всё верно,
только вы сравниваете значения указателей, а они в вашем случае никогда не будут равны
надо
C
1
   if(temp->info==temp1->info) k++;
или как-то так
LingWiloce
0 / 0 / 0
Регистрация: 07.10.2010
Сообщений: 19
06.11.2011, 16:11  [ТС]     Проблема ф-ии сравнения элементов списка #3
Извиняюсь, забыл добавить.
При изменении строки 11 на:
C++
1
    { if(temp->data==temp1->data) k++;
абсолютно ничего не меняется, а если заменить == на !=, то одинаковые слова у него не равны (опять же, как будто сравниваются указатели) и соответственно, счетчик исправно увеличивается
OstapBender
582 / 520 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
06.11.2011, 16:14     Проблема ф-ии сравнения элементов списка #4
Цитата Сообщение от LingWiloce Посмотреть сообщение
опять же, как будто сравниваются указатели
а может так и есть -
вы случаем там не С-строки сравниваете?

тогда strcmp() в помощь.
LingWiloce
0 / 0 / 0
Регистрация: 07.10.2010
Сообщений: 19
06.11.2011, 17:10  [ТС]     Проблема ф-ии сравнения элементов списка #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void mission() //функция посчета одинаковых элементов в списке
{
int i=0,k=0;
//char end=0, spec[250];
node *temp, *temp1; 
temp = head; 
while (temp != NULL)
{   
    temp1=temp->next;
    while (temp1 != NULL) 
    {   if(strcmp(temp1->data, temp->data)!=0) k++;
        temp1=temp1->next;
    }
    temp=temp->next;
}
Тоже не помогает. Результат аналогичный: при выводе k=0.
Вот структура списка:
C++
1
2
3
4
5
typedef struct node 
{ 
char data[250]; 
node *next; 
};
Одна из функций ввода:
C++
1
2
3
4
5
6
7
8
9
void insert_from_front() //функция вставки пользовательского значения элемента списка слева
{ 
node *temp; 
temp = new node; 
cout << "Enter data: "; 
cin >> temp->data; 
temp->next = head; 
head = temp; 
}
Добавлено через 18 минут
upd: извиняюсь, про способ работы strcmp узнал только сейчас.
Заменил != на ==, все подсчитывает, допустим:
net net da lalala da da da
Тогда на выводе k=7.
Таким образом он считает кол-во пар.
Я понимаю, что так и должно быть, но с точки зрения обычного пользователя, по идее, должно быть 6?
А если
net net da lalala da da da da
То k = 11, но должно быть (опять же, с точки зрения пользователя) 7.
Но до реализации этого додуматься не могу.
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.11.2011, 17:11     Проблема ф-ии сравнения элементов списка #6
strcmp() возвращает ноль, когда элементы равны
LingWiloce
0 / 0 / 0
Регистрация: 07.10.2010
Сообщений: 19
06.11.2011, 17:12  [ТС]     Проблема ф-ии сравнения элементов списка #7
Поправил вверху)
OstapBender
582 / 520 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
06.11.2011, 17:23     Проблема ф-ии сравнения элементов списка #8
когда строки равны strcmp возвращает нулевой результат.

строки у вас из 1 слова?

функция ввода нормальная.

с тайпдефом немного не согласен, но раз и так работает...

Добавлено через 6 минут
хм да... что-то не подумал о такой ситуации.
конечно это не верный результат.

пока вижу токо 2 способа решения:
1) сделать немое множество и проверяемый элемент заносить в него и temp->next->data проверять есть ли в множестве - если есть - то к следующей итерации.
2) сделать 3-е поле isChecked=0. проверять его на 0 перед k++. когда strcmp вернула '0' делать isChecked=1;
LingWiloce
0 / 0 / 0
Регистрация: 07.10.2010
Сообщений: 19
06.11.2011, 18:44  [ТС]     Проблема ф-ии сравнения элементов списка #9
Цитата Сообщение от OstapBender Посмотреть сообщение
1) сделать немое множество и проверяемый элемент заносить в него и temp->next->data проверять есть ли в множестве - если есть - то к следующей итерации.
2) сделать 3-е поле isChecked=0. проверять его на 0 перед k++. когда strcmp вернула '0' делать isChecked=1;
Сложно представить реализацию обоих способов. Мне это видится так:
1) Если у нас, допустим, список:
x x y y x
То: берем х, следующим проверяемым элементом тоже будет x, значит переходим на второй элемент и k не увеличивается (а ведь должен). Теперь х проверяем с y, они разные, значит проходим по списку и ищем х. Он у нас один (последний), значит k++. Теперь берем y, следующий элемент тоже y, значит переходим на следующий y и счетчик не увеличиваем. Теперь переходим к след. y, после него x, значит проходим по списку, но т.к. после второго y таких же элементов нет, то счетчик не увелчивается.
Итого: k=1. А должно быть 3.
2) Второй способ представить не могу.

попытался сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
node *temp, *temp1, *temp2; 
temp = head;
while (temp != NULL)
{   
    temp1=temp->next;
    while (temp1 != NULL) 
    {   if(strcmp(temp->data, temp1->data)==0) k++;
        temp1=temp1->next;
    }
    temp2=temp;
    temp=temp->next;
    if(strcmp(temp->data, temp2->data)==0) break;
}
ни к чему хорошему не привело

Добавлено через 33 минуты
Вроде более-менее что-то стал осознавать, однако после вызова данной функции прога вылетает с ошибкой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void mission() //функция посчета одинаковых элементов в списке
{
int i=0,k=0;
//char end=0, spec[250];
node *temp, *temp1, *temp2; 
temp = head;
temp2 = NULL;
while (temp != NULL)
{   
    if(temp2 != NULL)  
    while (temp != NULL)
    {
        if(strcmp(temp->data, temp2->data)==0)
        i=1;
    }
    if(i==1) temp=temp->next;
    temp1=temp->next;
    while (temp1 != NULL) 
    {   
        if(strcmp(temp->data, temp1->data)==0) k++;
        temp1=temp1->next;
    }
    temp2=temp;
    temp=temp->next;
}
cout << "Quantity of special nodes: "<< k;
}
OstapBender
582 / 520 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
06.11.2011, 19:13     Проблема ф-ии сравнения элементов списка #10
C
1
2
3
4
5
6
typedef struct node 
{ 
char data[250]; 
node *next;
int isChecked;
};
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void mission() //функция посчета одинаковых элементов в списке
{
int i=0,k=0;
//char end=0, spec[250];
node *temp, *temp1; 
temp = head; 
while (temp != NULL)
{   
        temp1=temp->next;
    while (temp1 != NULL) 
        {       
            if(strcmp(temp1->data, temp->data)==0 && !temp1->isChecked) 
           { 
                k++; 
                temp1->isChecked=1; 
           }
           temp1=temp1->next;
    }
    temp=temp->next;
}
LingWiloce
0 / 0 / 0
Регистрация: 07.10.2010
Сообщений: 19
06.11.2011, 19:30  [ТС]     Проблема ф-ии сравнения элементов списка #11
Из-за условия
C++
1
!temp1->isChecked
k не увеличивается вообще
OstapBender
582 / 520 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
06.11.2011, 19:43     Проблема ф-ии сравнения элементов списка #12
эту ячейку занулите сначала во всем списке тогда.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2011, 20:04     Проблема ф-ии сравнения элементов списка
Еще ссылки по теме:

C++ Удаление элементов из списка
C++ Как называются массивы элементов для сравнения времени работы сортировок?
C++ Удаление элементов из списка
C++ Проблема сравнения чисел с плавающей точкой
C++ Реализуйте однонаправленный список.Режим сортировки элементов списка без перестановки самих элементов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
LingWiloce
0 / 0 / 0
Регистрация: 07.10.2010
Сообщений: 19
06.11.2011, 20:04  [ТС]     Проблема ф-ии сравнения элементов списка #13
А ларчик просто открывался...
Все верно, более того, достаточно использовать просто булевую переменную в условии, а не указатель на неё (с указателем ловил ошибку ввиду того, что для использования этого указателя необходимо заводить отдельное множество, т.е. temp2).
Единственное, что осталось, это, если найдены повторения при первом сравнении нового слова, увеличивать k не на 1, а на 2.
Но с этим уж разберусь.
Большое спасибо за помощь!
Yandex
Объявления
06.11.2011, 20:04     Проблема ф-ии сравнения элементов списка
Ответ Создать тему
Опции темы

Текущее время: 14:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru