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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2010, 22:22   #1
Dartchuwak
Пользователь
 
Регистрация: 08.01.2009
Сообщений: 21
Вопрос (Си) Списки

Есть программа работы со списками.Надо её изменить так что бы она указывала является ли список пустым или нет.Больше ничего не требуется.
Код:
#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include <stdio.h>
#define MAX_LENGTH 10


struct StrNode
{
	char line[MAX_LENGTH+1];
	StrNode* next;
};

StrNode* InitList(char* defaulttext, int* lngth);
int FindSymbol(StrNode* head, char symbol, int length);
void ShowList(StrNode* head);


void main()
{
	int k,l;
	StrNode* headnode;
	char basestr[128];
	char smb;
	clrscr();
	cout<<"Vvedite stroku\n";
	scanf("%s",&basestr);
	scanf("%s",&smb);
	headnode=InitList(basestr,&l);
	cout<<"Ishodnoe predstavlenie\n";
	ShowList(headnode);
	k=FindSymbol(headnode,smb,l);
	if (k>0) {cout<<"Stroka: "<<(k/10+1)<<" Positsia: "<<k%10+1;}
	else cout<<"Ne naideno!";
	getch();

}

StrNode* InitList(char* defaulttext, int* lngth)
{
	StrNode *head,*nexxt,*buf;
	int length=0;
	for (;defaulttext[length]!='\0';length++);
	head=new StrNode;
	nexxt=head;
	for (int i=0;i<=length;i++)
	{
		if ((i>=MAX_LENGTH)&&((i%MAX_LENGTH)==0))
		{
			buf=new StrNode;
			nexxt->line[MAX_LENGTH]='\0';
			nexxt->next=buf;
			nexxt=nexxt->next;
		};
		nexxt->line[i%MAX_LENGTH]=defaulttext[i];
	}
	nexxt->line[i%MAX_LENGTH+1]='\0';
	nexxt->next=NULL;
	*lngth=length;
	return head;
}

int FindSymbol(StrNode* head, char symbol, int length)
{
	StrNode* buf;
	int k=0,i,fnd=0,hborder;
	buf=head;
	while ((buf!=NULL)&&(fnd==0))
	{
		k++;
		i=0;
		fnd=0;
		if ((length-10*(k-1))>10) hborder=10;
		else hborder=length%10;
		while ((fnd==0)&&(i<hborder))
		{
			if (buf->line[i]==symbol) fnd=1;
			else (i++);
		}
		buf=buf->next;
	}
	return ((k-1)*10+i);
}

void ShowList(StrNode* head)
{
	StrNode* buf;
	buf=head;
	while (buf!=NULL)
	{
		cout<<buf->line;
		cout<<'\n';
		buf=buf->next;
	}
}
Dartchuwak вне форума Ответить с цитированием
Старый 11.01.2010, 23:05   #2
Dartchuwak
Пользователь
 
Регистрация: 08.01.2009
Сообщений: 21
По умолчанию

Помогите пожалуйста
Dartchuwak вне форума Ответить с цитированием
Старый 12.01.2010, 00:52   #3
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

каким образом указывала? выводила на экран, что список пустой?

нужно проверять указатель на начало списка, если он равен NULL, то список пустой.

для функций ShowList и FindSymbol можно добавить в самом начале: if (head == NULL) { cout << "Список пуст"; return }

и
Код:
StrNode* InitList(char* defaulttext, int* lngth)
{
	StrNode *head,*nexxt,*buf;
	int length=0;
	for (;defaulttext[length]!='\0';length++);
	head=new StrNode;
	nexxt=head;
	for (int i=0;i<=length;i++)
	{
		if ((i>=MAX_LENGTH)&&((i%MAX_LENGTH)==0))
		{
			buf=new StrNode;
			nexxt->line[MAX_LENGTH]='\0';
			nexxt->next=buf;
			nexxt=nexxt->next;
		};
		nexxt->line[i%MAX_LENGTH]=defaulttext[i];
	}
	nexxt->line[i%MAX_LENGTH+1]='\0';
	nexxt->next=NULL;
	*lngth=length;
	return head;
}
здесь переменная i считается необъявленной, т. к. она описана в блоке цикла for, и действует только в нём.

Последний раз редактировалось Alex_FF; 12.01.2010 в 01:02.
Alex_FF вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Списки С\С++ Defo Помощь студентам 4 28.08.2009 17:31
списки sergeykl Паскаль, Turbo Pascal, PascalABC.NET 8 04.08.2009 23:05
списки Влдислаав3911 Паскаль, Turbo Pascal, PascalABC.NET 5 10.05.2008 17:35