struct Item {
char strok[32];
Item* elemNext;
Item* elemPrev;
};
struct List
{
Item* itsFirst;
Item* itsLast;
};
List* theList = 0;
// заполнение списка
void list_in_file(List& theList)
{
std::ifstream fd_s("file_name.txt", std::ios::in);
if(!fd_s.eof())
{
Item* newItem=new Item; //указатель на новый элемент списка
fd_s.getline(newItem->strok,sizeof(newItem->strok));
if(theList.itsFirst)
{
theList.itsFirst->elemNext=newItem;
theList.itsFirst=newItem;
}
theList.itsFirst=newItem;
newItem->elemNext=0;
}
std::cout<<"Item was added"<<std::endl<<std::endl;
}
Заполнение списка из файла!!
Какие-то проблемы с циклом если пишу if(!fd_s.eof()) выводится только первый элемент из файла , если while(!fd_s.eof()) то последний.
Код:
Содержание файла
Код:
int
main
stryct
class
float
double
enum
return
break
goto
cout
cin
printf
scanf
new
delet
malloc
getch
while
for
switch
main
stryct
class
float
double
enum
return
break
goto
cout
cin
printf
scanf
new
delet
malloc
getch
while
for
switch
дальше...
Код:
if(theList.itsFirst)
{
theList.itsFirst->elemNext=newItem;
theList.itsFirst=newItem;
}
theList.itsFirst=newItem;
newItem->elemNext=0;
}
{
theList.itsFirst->elemNext=newItem;
theList.itsFirst=newItem;
}
theList.itsFirst=newItem;
newItem->elemNext=0;
}
судя по всему проблема в том, что ты забываешь определить newItem->elemPrev...
т.е., если я правильно понял логику работы списка, ты добавляешь элемент newItem в список и указываешь, что перед ним ничего нет - newItem->elemNext=0... вот только указатель newItem на элемент после него не определен... т.е. newItem->elemPrev не используется и скорее всего именно в этом ошибка.
в итоге твой код лишь заменяет единственный элемент списка, вместо того, чтобы перекинуть указатели...
уже выкладывал свой старый код тут: http://forum.codenet.ru/showpost.php?p=322215&postcount=13
посмотри, там примерно то же, что и у тебя, только вместо строки я использую численное поле
П.С. а вообще, для выявления таких ошибок хорошо помогает Debugger Visual Studio и его вкладочка Watch...
п.с.с. у всех обострение написания кода для курсовиков?))) мне бы ваши проблемы)) я вот замучался писать сам текст для курсача)) ибо большая часть теории у меня в английских статьях и не имеет нормальных аналогов на русском(((
ах да... используй вместо 0 - NULL(так правильнее), и вместо if(theList.itsFirst) явную проверку, скажем if(theList.itsFirst!= NULL), а так читабельнее
Код:
// заполнение списка
void list_in_file(List& theList)
{
std::ifstream fd_s("file_name.txt", std::ios::in);
while(!fd_s.eof())
{
Item* newItem=new Item; //указатель на новый элемент списка
fd_s.getline(newItem->strok,sizeof(newItem->strok));
newItem->elemNext=theList.itsFirst;
newItem->elemPrev=NULL;
if(theList.itsFirst)
{
theList.itsFirst->elemPrev=newItem;
theList.itsFirst=newItem;
}
if(!theList.itsLast)
{
theList.itsLast=theList.itsFirst;
}
delete [] newItem;
}
std::cout<<"Item was added"<<std::endl<<std::endl;
}
void list_in_file(List& theList)
{
std::ifstream fd_s("file_name.txt", std::ios::in);
while(!fd_s.eof())
{
Item* newItem=new Item; //указатель на новый элемент списка
fd_s.getline(newItem->strok,sizeof(newItem->strok));
newItem->elemNext=theList.itsFirst;
newItem->elemPrev=NULL;
if(theList.itsFirst)
{
theList.itsFirst->elemPrev=newItem;
theList.itsFirst=newItem;
}
if(!theList.itsLast)
{
theList.itsLast=theList.itsFirst;
}
delete [] newItem;
}
std::cout<<"Item was added"<<std::endl<<std::endl;
}
Код:
delete [] newItem;
естественно... вы же добавляете элемент и сразу его того, удаляете)
лучше эту строчку удалите из своего кода))
Цитата: Norgat
Код:
delete [] newItem;
естественно... вы же добавляете элемент и сразу его того, удаляете)
лучше эту строчку удалите из своего кода))
Да удалил но роли она не сыграла!!!
Цитата: _EXP_
Да удалил но роли она не сыграла!!!
мм... тогда сделай так.... добавь после fd_s.getline(...)
std::cout << "read Item: " << newItem->strok << std::endl;
и запусти цикл... если выводит содержимое файла в консоль - значит проблема в логике работы указателей, если ничего не выводит, тогда проблема с доступом к файлу...
и выложи свой код вывода списка на экран, может у тебя в него ошибка закралась?
Код:
struct Item {
char strok[32];
Item* elemNext;
Item* elemPrev;
};
struct List
{
Item* itsFirst;
Item* itsLast;
};
List* theList = 0;
// вывод списка
void printfList(List& theList)
{
std::cout<<"++++++List content +++++++"<<std::endl;
Item* curItem=theList.itsFirst; // указатель на начало списка
while(curItem)
{
std::cout<<curItem->strok<<std::endl;
curItem=curItem->elemNext;
}
std::cout<<"End List"<<std::endl<<std::endl;
}
// заполнение списка
void list_in_file(List& theList)
{
std::ifstream fd_s("file_name.txt", std::ios::in);
while(!fd_s.eof())
{
Item* newItem=new Item; //указатель на новый элемент списка
fd_s.getline(newItem->strok,sizeof(newItem->strok));
std::cout << "read Item: " << newItem->strok << std::endl;
newItem->elemNext=theList.itsFirst;
newItem->elemPrev=NULL;
if(theList.itsFirst)
{
theList.itsFirst->elemPrev=newItem;
theList.itsFirst=newItem;
}
if(!theList.itsLast)
{
theList.itsLast=theList.itsFirst;
}
}
std::cout<<"Item was added"<<std::endl<<std::endl;
}
// поиск
void findList(List& theList)
{
char my_ind [32];
std::cout<<"++++++Input indif +++++++"<<std::endl;
std::cin>>my_ind;
Item* curItem=theList.itsFirst; // указатель на начало списка
while(curItem)
{
if(curItem->strok==my_ind)
{
std::cout<<"Inpet"<<std::endl;
}
else
{
std::cout<<"No Input"<<std::endl;
}
curItem=curItem->elemNext;
}
std::cout<<"End List"<<std::endl<<std::endl;
}
void menu()
{
while(true)
{
bool quit=false;
int choice;
std::cout<<"++++++++++++++MENU+++++++++++"<<std::endl;
std::cout<<"(1) Creat List"<<std::endl;
std::cout<<"(2) Add List"<<std::endl;
std::cout<<"(3) Printf List"<<std::endl;
std::cout<<"(4) Find List"<<std::endl;
std::cout<<"(5) Quit"<<std::endl;
std::cout<<std::endl;
std::cin>>choice;
std::cout<<std::endl;
switch(choice)
{
case (1):
if(!theList)
{
theList=new List;
theList->itsFirst=0;
theList->itsLast=0;
std::cout<<"The List has been created succesfully"<<std::endl<<std::endl;
}
else
{
std::cout<<"The List is already created"<<std::endl<<std::endl;
}
break;
case (2):
if(theList)
{
list_in_file(*theList);
}
else
std::cout<<"The List is not created"<<std::endl<<std::endl;
break;
case (3):
if(theList)
{
printfList(*theList);
}
else
std::cout<<"The List is not created"<<std::endl<<std::endl;
break;
case (4):
if(theList)
{
findList(*theList);
}
else
std::cout<<"The List is not created"<<std::endl<<std::endl;
break;
case (5):
quit=true;
}
if (quit==true)
break;
}
}
char strok[32];
Item* elemNext;
Item* elemPrev;
};
struct List
{
Item* itsFirst;
Item* itsLast;
};
List* theList = 0;
// вывод списка
void printfList(List& theList)
{
std::cout<<"++++++List content +++++++"<<std::endl;
Item* curItem=theList.itsFirst; // указатель на начало списка
while(curItem)
{
std::cout<<curItem->strok<<std::endl;
curItem=curItem->elemNext;
}
std::cout<<"End List"<<std::endl<<std::endl;
}
// заполнение списка
void list_in_file(List& theList)
{
std::ifstream fd_s("file_name.txt", std::ios::in);
while(!fd_s.eof())
{
Item* newItem=new Item; //указатель на новый элемент списка
fd_s.getline(newItem->strok,sizeof(newItem->strok));
std::cout << "read Item: " << newItem->strok << std::endl;
newItem->elemNext=theList.itsFirst;
newItem->elemPrev=NULL;
if(theList.itsFirst)
{
theList.itsFirst->elemPrev=newItem;
theList.itsFirst=newItem;
}
if(!theList.itsLast)
{
theList.itsLast=theList.itsFirst;
}
}
std::cout<<"Item was added"<<std::endl<<std::endl;
}
// поиск
void findList(List& theList)
{
char my_ind [32];
std::cout<<"++++++Input indif +++++++"<<std::endl;
std::cin>>my_ind;
Item* curItem=theList.itsFirst; // указатель на начало списка
while(curItem)
{
if(curItem->strok==my_ind)
{
std::cout<<"Inpet"<<std::endl;
}
else
{
std::cout<<"No Input"<<std::endl;
}
curItem=curItem->elemNext;
}
std::cout<<"End List"<<std::endl<<std::endl;
}
void menu()
{
while(true)
{
bool quit=false;
int choice;
std::cout<<"++++++++++++++MENU+++++++++++"<<std::endl;
std::cout<<"(1) Creat List"<<std::endl;
std::cout<<"(2) Add List"<<std::endl;
std::cout<<"(3) Printf List"<<std::endl;
std::cout<<"(4) Find List"<<std::endl;
std::cout<<"(5) Quit"<<std::endl;
std::cout<<std::endl;
std::cin>>choice;
std::cout<<std::endl;
switch(choice)
{
case (1):
if(!theList)
{
theList=new List;
theList->itsFirst=0;
theList->itsLast=0;
std::cout<<"The List has been created succesfully"<<std::endl<<std::endl;
}
else
{
std::cout<<"The List is already created"<<std::endl<<std::endl;
}
break;
case (2):
if(theList)
{
list_in_file(*theList);
}
else
std::cout<<"The List is not created"<<std::endl<<std::endl;
break;
case (3):
if(theList)
{
printfList(*theList);
}
else
std::cout<<"The List is not created"<<std::endl<<std::endl;
break;
case (4):
if(theList)
{
findList(*theList);
}
else
std::cout<<"The List is not created"<<std::endl<<std::endl;
break;
case (5):
quit=true;
}
if (quit==true)
break;
}
}
1) List* theList = 0; - это зачем?
2) уже писал, но напишу ещё раз...
проверки типа while(curItem) - плохой стиль, пиши while(curItem!= NULL)
3)
Код:
if(theList.itsFirst)
{
theList.itsFirst->elemPrev=newItem;
theList.itsFirst=newItem;
}
if(!theList.itsLast)
{
theList.itsLast=theList.itsFirst;
}
{
theList.itsFirst->elemPrev=newItem;
theList.itsFirst=newItem;
}
if(!theList.itsLast)
{
theList.itsLast=theList.itsFirst;
}
а где добавление элемента theList.itsFirst? нужно как то так
Код:
if(theList.itsFirst!= NULL)
{
theList.itsFirst->elemPrev=newItem;
theList.itsFirst=newItem;
}
else
{
theList.itsFirs = newItem;
}
if(theList.itsLast == NULL)
{
theList.itsLast=theList.itsFirst;
}
{
theList.itsFirst->elemPrev=newItem;
theList.itsFirst=newItem;
}
else
{
theList.itsFirs = newItem;
}
if(theList.itsLast == NULL)
{
theList.itsLast=theList.itsFirst;
}
Спасибо разобрался все заработало!!
1. Для чего список сделан двухсвязный, если его возможности не используются?
2. Список theList объявлен глобальным, между тем ссылка на него передаётся в функции. Зачем?
3. Много грамматических ошибок. Моё чувство прекрасного уязвлено.
4. Имхо, названия itsFirst и itsLast какие-то неудобоваримые. Лучше просто First и Last.
5. При завершении программы не мешало бы освободить занимаемую память.