Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2012, 17:27   #1
NickolayNest
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 40
Вопрос Как решить задачу на си: вывести слова, встречающиеся один раз в строке?

Подскажите, пожалуйста!
Дана задача:
Дана строка символов. Вывести все слова, встречающиеся в тексте по одному разу

Я уже пересмотрел разные книги, но не могу сообразить, как это сделать?

Думал, поместить все слова в массив, а потом их все попарно сравнить..
Но не знаю, как можно реализовать это на си.
NickolayNest вне форума Ответить с цитированием
Старый 03.11.2012, 18:51   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А как ты на слова разбиваешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.11.2012, 07:15   #3
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Код:
#include <stdio.h>
#include <string.h>
#include <malloc.h>

//стэк(LIFO)
typedef struct _stack {
   char* p;
   struct _stack* next;
} stack;


// втолкнуть в стэк
stack* push(const char* s, stack* st) {
   stack* ptr;
   // проверим стэк на уникальность каждое входное слово
   for(ptr = st; ptr != NULL; ptr = ptr->next) {
       if(! strcmp(ptr->p, s))
           return st;
   }

   ptr = (stack*)malloc(sizeof(stack));
   if(! ptr)
        return st;

   ptr->p = (char*) malloc(strlen(s) + 1);
   strcpy(ptr->p, s);
   ptr->next = st;
   return ptr;
}

// вытолкнуть из стэка
stack* pop(stack* s) {
   stack* t = s;
   s = s->next;
   free(t->p);
   free(t);
   return s;
}



int main(){
   stack* st = NULL;
   char s[]  = "area, area, area,   general. top-gun general(area), gun";
   char* p;

   // разбиваем слова
   for(p = strtok(s, " (-)\t.,"); p; p = strtok(NULL, " (-)\t.,")) 
        st = push(p, st);
	
   // выводим слова из стэка
   while(st != NULL) {
        puts(st->p);
        st = pop(st);
   }

   return 0;
}
Nuklon вне форума Ответить с цитированием
Старый 04.11.2012, 12:28   #4
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Добавьте в структуру счётчик и инкрементируйте его при добавлении дубля. Выводите только те слова, для которых значение счётчика равно единице.
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение списка по ХП внутри ХП происходит один раз или на каждой строке? DeveloPerchik БД в Delphi 0 14.04.2012 20:41
Дан текст, в котором слова отделяются друг от друга пробелами, удалить из текста все повторно встречающиеся слова Anton94.by Паскаль, Turbo Pascal, PascalABC.NET 1 16.12.2011 11:03
Удалить все слова, встречающиеся более 2 раз kat297 Общие вопросы Delphi 3 11.06.2010 16:27
Ввести строку, вывести на экран символы, повторяющиеся в строке более 2 раз. bibl2008 Помощь студентам 4 01.03.2009 13:30