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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2009, 19:58   #1
NamelessEndless
Ворон-мститель
Пользователь
 
Аватар для NamelessEndless
 
Регистрация: 26.05.2008
Сообщений: 24
Восклицание Cписок кольцевой.С++.Не могу найти ошибку. Срочно.

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

Программа наполовину работает - создает список, нормально его выводит. Очевидно, ошибка в функциии которая считает количество разных букв, + не идет удаление элемента.

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

typedef  struct list_element {
		char inf[26];
		struct list_element *nadr;
	 } LEL;

LEL *first, *last;

LEL* NewElem(char *dani);
LEL* DelListElem(int);
void MakeList(void);
void PrintList(void);
int  DifferentSymbols(char *); //ищет количество разных букв, возвращает его



int n=1;
char  buf[26];

void main () 
{
	LEL *list;
	int i, max=0;

	clrscr();
	puts("\t\t.:Start of creating list:.");
	MakeList();
	puts("\t\t.:Creating ended:.");
	puts("\t\t .:Created list:.");
	PrintList();
	for ( i=0; i<n; i++){
	   if (DifferentSymbols(list->inf)>max)
		 max=DifferentSymbols(list->inf);
	}
	printf("\t\t.:Max quantity of differenf symbols:.%d\n",max);
	DelListElem(max);
	puts("\t\t   .:New list:.");
	PrintList();
	getch();
}

 void MakeList () {
	LEL *help;
	  do {
	    printf("Word N%d: ",n);
	    gets(buf);
	    if(*buf=='\0') break;
		else{
		  if(last==NULL)
			  first=last=NewElem(buf);
			else {
			  help= NewElem(buf);
			  last->nadr=help;
			  last=help;
			 }
		}
	     n++;
	   } while(1);
	last->nadr=first;
}

LEL* NewElem(char *dani)
 {
	LEL *pnew;
	pnew=(LEL*)malloc(sizeof(LEL));
	strcpy(pnew->inf,dani);
	pnew->nadr=NULL;
	return pnew;
}

void PrintList(void) 
{
	 LEL* pel=first;

	   do {
	     puts(pel->inf);
	     pel=pel->nadr;
	   }while (pel!=first);

}

char arr[26];

 int  DifferentSymbols(char * wrd){
	int i=0,kst=0;
	char *q=wrd;

	while (*q) {
		if (strchr(arr,*q)==NULL){
			arr[i]=*q;
			kst++;
		} q++; i++;
	}

       return kst;
 }

LEL * DelListElem (int a)
 {  	LEL * pst=first;
	int i;
      for (i=0; i<n; i++) {
       if ((DifferentSymbols(pst->inf))==a)
	   pst=pst->nadr;
      }
       return first;
 }
Пробовала отдельно писать функцию для поиска количества разных букв - работает..
Код:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>

void main ()
{     	int k=0,i=0;
	char word, arr[26];
	char *q;


	clrscr();
	puts ("Vvedit slovo");
	gets(&word);
	*q=word;
	while (*q){
	  if (strchr(arr,*q)==NULL)
	     {arr[i]=*q;
	      k++;
	      } q++; i++;
	}
	printf ("k-t riznuh liter - %d",k);

 getch();
}
Помогите пожалуйста. Кто видит ошибку..?
Исполняется в борланд си++.
Бог умер. Воскрес и мстит.
NamelessEndless вне форума Ответить с цитированием
Старый 21.01.2009, 21:29   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

вот так вроде что то удаляет

Код:
void main () 
{
	LEL *list;
	int i, max=0;
	
	
	puts("\t\t.:Start of creating list:.");
	MakeList();
	list=first;
	puts("\t\t.:Creating ended:.");
	puts("\t\t .:Created list:.");
	PrintList();
	do{
	   if (DifferentSymbols(list->inf)>max)
	   {	
		   max=DifferentSymbols(list->inf);
	    }
	  list=list->nadr; // сдвигаем указатель для сравнения всех слов из списка
	}while(list!=first);
	printf("\t\t.:Max quantity of differenf symbols:.%d\n",max);
	DelListElem(max);
	puts("\t\t   .:New list:.");
	PrintList();
	getch();
}
Код:
void DelListElem (int a)
 {  
	LEL * pst=first,*pred=last;
	int i;
 
	do{
       if ((DifferentSymbols(pst->inf))==a)

	   {   // само удаление
		   if(pst==first)
		   {
			   first=pst->nadr;
		   }
		   pred->nadr=pst->nadr;
		   delete pst;
		   break;
	   }
	   else
	   {
		   pred=pst;          // сдвиг указателя дальше
		   pst=pst->nadr;
	   }
      }while(pst!=first);
}
counter вне форума Ответить с цитированием
Старый 21.01.2009, 21:47   #3
NamelessEndless
Ворон-мститель
Пользователь
 
Аватар для NamelessEndless
 
Регистрация: 26.05.2008
Сообщений: 24
По умолчанию

counter, ыы..у тебя точно удаляет что-то? я запускаю - нифига, после того как выводит список введенных слов - зависает и все. Ничего с ним не сделаешь..Не понимаю почему...

А с подсчетом символов не видишь где косяк?
Я только что опять вдоль и впоперек перерыла прогу. Ничего не нашла.
Незнаю что за чертовщина...
Бог умер. Воскрес и мстит.
NamelessEndless вне форума Ответить с цитированием
Старый 21.01.2009, 21:51   #4
NamelessEndless
Ворон-мститель
Пользователь
 
Аватар для NamelessEndless
 
Регистрация: 26.05.2008
Сообщений: 24
По умолчанию

тэкс, глюк прошел. уже удаляет, но не то, что надо...

агррр. и в макс. числе разных символов выводит 0..
Бог умер. Воскрес и мстит.
NamelessEndless вне форума Ответить с цитированием
Старый 21.01.2009, 21:54   #5
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

а что вообще она должна удалять?
пример может покажи какой...
counter вне форума Ответить с цитированием
Старый 21.01.2009, 21:59   #6
NamelessEndless
Ворон-мститель
Пользователь
 
Аватар для NamelessEndless
 
Регистрация: 26.05.2008
Сообщений: 24
По умолчанию

шас покажу.
например: вводим слова
слово 1: qwer
слово 2: asdfghjkl
слово 3: asdfg
слово 4: rty
слово 5: kl
функция DifferentSymbols должна посчитать количество разных букв в каждом слове, потом определяем, в каком слове этих букв больше. это у нас max. И потом, енто слово мы должны удалить. То есть на примере max должен быть равным 9 (второе слово) и удалить надо второй элемент списка, то есть в конце получаем:
слово 1: qwer

слово 3: asdfg
слово 4: rty
слово 5: kl

вот..что-то типа того
Бог умер. Воскрес и мстит.
NamelessEndless вне форума Ответить с цитированием
Старый 21.01.2009, 22:29   #7
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Код:
int  DifferentSymbols(char * wrd){
	int i=0,kst=0,flag=0;
	char *q=wrd;
          char arr[26]; // массив в функции надо объявить чтобы он обнулялся на каждом слове а не считал все подряд
	while (*q) {
		if (strchr(arr,*q)==NULL){
			arr[i]=*q;

			kst++;
		} q++; i++;
	}

       return kst;
 }
counter вне форума Ответить с цитированием
Старый 21.01.2009, 22:43   #8
NamelessEndless
Ворон-мститель
Пользователь
 
Аватар для NamelessEndless
 
Регистрация: 26.05.2008
Сообщений: 24
По умолчанию

не-а..((( у меня дальше не идет. и удаляет хз что..и дальше все по нулям.
иду дальше мучать ...
Бог умер. Воскрес и мстит.
NamelessEndless вне форума Ответить с цитированием
Старый 22.01.2009, 00:11   #9
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

получается вот так
Изображения
Тип файла: jpg 1.jpg (34.3 Кб, 122 просмотров)
counter вне форума Ответить с цитированием
Старый 22.01.2009, 00:28   #10
NamelessEndless
Ворон-мститель
Пользователь
 
Аватар для NamelessEndless
 
Регистрация: 26.05.2008
Сообщений: 24
По умолчанию

O_o хммм...
что-то я у себя пропустила, что ли..недосмотрела..
дай пожалуйста код, тот что ты у себя запускаешь.
а то я действительно уже засыпаю, может точно где строку пропустила..
позязя..)
Бог умер. Воскрес и мстит.
NamelessEndless вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти ошибку(С++) Yura_n Помощь студентам 8 20.01.2009 12:36
Не могу найти ошибку. Picaso18 Паскаль, Turbo Pascal, PascalABC.NET 3 19.01.2009 17:05
Не могу найти ошибку . KVANTOM Общие вопросы Delphi 2 08.01.2009 17:15
Не могу найти ошибку! Эдуард Общие вопросы C/C++ 7 27.02.2008 16:34