Динамический список

XADD

New Member
11.09.2011
2
0
#1
C++:
#include <iostream>
using namespace std;

class List
{
class Node
{
public:
int d;
int Year;
char Author;
char Name;
Node *next;
Node *prev;
Node (int dat=0, int year=0, char Author=0, char Name=0)
{
d=dat;
Year=year;
next=0;
prev=0;
}
};
Node *pbeg,*pend;
public:
List() {pbeg=0; pend=0;}
~List()
{
if (pbeg!=0)
{
Node *pv=pbeg;
while (pv)
{
pv=pv->next;
delete pbeg;
pbeg=pv;
}
}
}
void Add (int d, int year, char Author, char Name)
{
Node *pv = new Node(d,year,Author,Name);
if (pbeg==0) pbeg=pend=pv;
else
{
pv->prev=pend;
pend->next=pv;
pend=pv;
}
}

void Print ()
{
Node *pv=pbeg; 
cout << endl << "List: ";
while (pv) 
{
cout << pv->d << ' ';
cout << pv->Year << ' ';
cout << pv->Author << '';
cout << pv->Name << '';
pv=pv->next;
}
cout << endl;

}

};
int main()
{
List l;
char a,b;

cin >> a;
cin >> b;
l.Add(1,1990,a,b);
l.Print();
return 0;
}
Задача состоит в том что бы получить динамический список с четырьмя параметрами, программа очень простая и вроде понятно что она должна делать.ПеременнаяAuthor содержит имя автора, Name название книги. Но оно не работает. Спасибо.
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#2
Переменные типа char могут содержать в себе только один байт информации, а ты пытаешься запихать туда целую строку. Пожалуйста.
 

XADD

New Member
11.09.2011
2
0
#3
Вообщем появилась новая проблема.
C++:
#include <iostream>
using namespace std;
struct comp
{
char Name[20];
char Author[20];
int year;
int d;
comp *next;
};
struct DynamicList
{
comp* head;
comp* tail;
};
class Library
{
public:

void MakeList(DynamicList &l)
{
l.head=NULL;
}
bool CheckEmpty(DynamicList &l)
{
return (l.head==NULL);
}
void Add(DynamicList &l,char* v)
{
char Nam[20];
cout << "Input Name: ";
cin >> Nam;
comp* c = new comp();
strcpy_s(c->Name, 20, Nam);
strcpy_s(c->Author, 10, v);
c->next = NULL;
if (CheckEmpty(l))
l.head = c;
else
l.tail->next = c;
l.tail = c;
} 
void Show (DynamicList &l)
{
while (l.head!=NULL)
{
cout << l.head->Name << " " << l.head->Author << endl;
l.head=l.head->next;
}
}
};
int main()
{
Library lol;
DynamicList vars;
lol.MakeList(vars);
char a[20]={0};
int vybor=0;
while (vybor!=5)
{
cin >> vybor;
if (vybor==1) lol.Add(vars,"First");
if (vybor==2) lol.Show(vars);
}

return 0;
}
Смысл программы подразумевает. Выбираем 1, добавляем запись, выбираем 2 просматриваем её, снова выбираем 1 добавляем новую запись и в просмотре уже должны быть две записи но она всего одна. что исправить? Получается список какой-то не верный.
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#5
Изменять значение l.head нельзя. Оно всегда должно указывать на начало списка.
C++:
	void Show (DynamicList &l)
{
while (l.head!=NULL)
{
cout << l.head->Name << " " << l.head->Author << endl;
l.head=l.head->next;
}
}
замени на:
C++:
	void Show (DynamicList &l)
{
comp *p = l.head;
while ( p )
{
cout << p->Name << " " << p->Author << endl;
p = p->next;
}
}
 
R

rrrFer

Гость
#6
Код:
#include <iostream>

struct comp {
char	Name[20],
Author[20];
comp	*next;
};
struct DynamicList {
comp	*head,
*tail;
};

class Library {
DynamicList l;

public:

Library( ) {
l .head = 0;
}

void Add( char *v ) {
char Nam[20];
std ::cout << "Input Name: ";
std ::cin >> Nam;

comp *c = new comp( );

strcpy_s( c ->Name, 20, Nam );
strcpy_s( c ->Author, 10, v );
c ->next = NULL;

if( 0 == l.head )
l .head = l .tail = c;
else
l .tail = l .tail ->next = c;

} 

void Show ( ) {
comp *p = l .head;

while ( p ) {
std ::cout << p ->Name << " " << p ->Author << std ::endl;
p = p ->next;
}
}
};
int main( ) {
Library			lol;
int				vybor;

vybor = 0;
for(;; ) {
std ::cin >> vybor;

switch( vybor ) {
case 0:
return 0;
case 1:
lol .Add( "First" );
break;
case 2:
lol .Show( );
break;
default:
std ::cout << "";
}
}
}
Впринципе работает, но явно не хватает деструктора, нужно дать нормальные имена переменным и мне не нравится структура DynamicList

Добавлено: и еще, реализацию методов лучше вынести в .cpp файл, а описание класса - в .h.
ЗЫ. Форматирование кода на форуме радует :)

Добавлено:
Изменять значение l.head нельзя
Там еще ошибка при добавлении узла была.
 

XADD

New Member
11.09.2011
2
0
#7
:) Спасибо. Еще бы функцию сортировки списка по полям и было бы вообще хорошо.
 
R

rrrFer

Гость
#8
5. Ну а те, кто не хочет что-то делать самостоятельно должны понимать, что работа людей стоит денег. Даже самая мелкая. А потому если вы готовы платить за решение своей проблемы, то так же указывайте это в своей теме. Что-то в духе: Нужно решить такую-то задачу. Оплата.
Да легко, при соблюдении пятого пункта правил раздела:
5. Ну а те, кто не хочет что-то делать самостоятельно должны понимать, что работа людей стоит денег. Даже самая мелкая. А потому если вы готовы платить за решение своей проблемы, то так же указывайте это в своей теме. Что-то в духе: Нужно решить такую-то задачу. Оплата.
 

XADD

New Member
11.09.2011
2
0
#9
Ну нет я самостоятельно хочу делать но не очень получается, вот например для двух элементов, не
как сделать для произвольного количества.
C++:
void Sort()
{
bool j=true;
comp *p=l.head;
char temp[20];
{
for (int i=0;i<2;i++)
{
for (int j=1;j>1;j--)
{
if ((char)(p->Author)>char((p->next)->Author)) 
{
strcpy(temp,p->Author);
strcpy(p->Author,((p->next)->Author));
strcpy(((p->next)->Author),temp);
}
}
}
}
}
 
R

rrrFer

Гость
#10
XADD
Сортировка списка по логике ничем не отличается от сортировки массива. Отличие лишь в том что вместо увеличения значение счетчика элементов массива необходимо писать нечто вроде:
Код:
 p = p ->next;
Так строки сравнивать нельзя:
Код:
(char)(p->Author)>char((p->next)->Author)
вы сравниваете первые элементы строк. Используйте strcmp

Добавлено:
Код:
 for (int i=0;i<2;i++)
{
for (int j=1;j>1;j--)
не нашел где вы индексы "i" и "j" используете

Добавлено: лишняя фигурная скобка, это не ошибка, но фигурная скобками ограничивается область видимости переменных. У вас она абсолютно не нужна, лишь вносит путаницу.
 

XADD

New Member
11.09.2011
2
0
#11
Вообщем появилось время я вновь вернулся к задача.
C++:
void Sort()
{
bool j=true;
comp *p=l.head;
char temp1[20];
char temp2[20];

while (p->next)
{
if (strcmp(p->Author,(p->next)->Author)>0)
{
strcpy(temp1,p->Author);
strcpy(p->Author,(p->next)->Author);
strcpy((p->next)->Author,temp1);

strcpy(temp2,p->Name);
strcpy(p->Name,(p->next)->Name);
strcpy((p->next)->Name,temp2);
}
p=p->next;
}
}
Почему-то не сортирует весь список полностью с первого раза.
Не хватает внутреннего цикла, но как его написать?
 
R

rrrFer

Гость
#12
XADD
Еще раз, посмотрите реализацию любого алгоритма сортировки и сравните с тем что получилось у вас