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

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

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

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

06.11.2011, 15:55. Просмотров 762. Ответов 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2011, 15:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблема ф-ии сравнения элементов списка (C++):

Проблема сравнения чисел с плавающей точкой - C++
Добрый вечер, развивая тему к которой меня подтолкнул, Байт, посоветуйте ряд лайффаков на тему фикса (кроссплатформенность же ж ) ...

Проблема сравнения данных в массиве с другими данными - C++
Только вчера начал осваивать С++, со многими вопросами разобрался, но с этим никак =( Данные: Есть двухмерный массив с тремя видами...

Проблема с функцией создания односвязного списка - C++
Есть функция (создание односвязного списка): struct List*CreateList(void){ DBase dBase(nRecord); struct List*BeginList; struct...

Проблема с классом для линейного списка - C++
Доброго времени суток! Начал писать класс для организации хранения данных в виде линейного списка, вот Header file:...

Функция заполнения массива и сравнения среднего значения элементов - C++
Написать функцию, которая заполняет массив случайными числами. Принимаемые параметры – имя массива, его размер и диапазон случайных чисел....

Удаление элементов из односвязного списка списка - C++
Привет всем знатокам, суровым программистам и профессионалам своего дела. Засел за реализацией списка и что то пока не могу понять. Задача...

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

тогда strcmp() в помощь.
1
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.
Но до реализации этого додуматься не могу.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.11.2011, 17:11 #6
strcmp() возвращает ноль, когда элементы равны
0
LingWiloce
0 / 0 / 0
Регистрация: 07.10.2010
Сообщений: 19
06.11.2011, 17:12  [ТС] #7
Поправил вверху)
0
OstapBender
583 / 521 / 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;
0
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;
}
0
OstapBender
583 / 521 / 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;
}
0
LingWiloce
0 / 0 / 0
Регистрация: 07.10.2010
Сообщений: 19
06.11.2011, 19:30  [ТС] #11
Из-за условия
C++
1
!temp1->isChecked
k не увеличивается вообще
0
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
06.11.2011, 19:43 #12
эту ячейку занулите сначала во всем списке тогда.
1
LingWiloce
0 / 0 / 0
Регистрация: 07.10.2010
Сообщений: 19
06.11.2011, 20:04  [ТС] #13
А ларчик просто открывался...
Все верно, более того, достаточно использовать просто булевую переменную в условии, а не указатель на неё (с указателем ловил ошибку ввиду того, что для использования этого указателя необходимо заводить отдельное множество, т.е. temp2).
Единственное, что осталось, это, если найдены повторения при первом сравнении нового слова, увеличивать k не на 1, а на 2.
Но с этим уж разберусь.
Большое спасибо за помощь!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2011, 20:04
Привет! Вот еще темы с ответами:

Как называются массивы элементов для сравнения времени работы сортировок? - C++
Гугл молчит. (

Реализуйте однонаправленный список.Режим сортировки элементов списка без перестановки самих элементов - C++
Реализуйте задание .В каждом из вариантов должно быть реализованы следующие режимы работы: • добавление элементов; • просмотр...

Двунаправленный список (добавление/удаление элементов в голову, просмотр списка, реализовать дублирование элементов с заданным значением) - C++
Здравствуйте! Помогите написать программу, обеспечивающую работу с двунаправленным нециклическим списком: добавление/удаление элементов в...

Написать код программы, выполняющей растяжку списка и вставку, удаление из списка и сжатие списка - C++
Люди ПОМОГИТЕ осталось совсем мало , мне нужна помощь!!! написать код программ: 1) Написать код программы, выполняющей растяжку...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.11.2011, 20:04
Ответ Создать тему
Опции темы

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