Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > линейный однонаправленный список


Автор: PriestOfLuna 27.6.2010, 09:17
программа с линейным однонаправленным списком. здесь создаю этот самый список. Пишет ошибку что last инициализируется более одного раза. И в той же строчке (последней) декларейшн синтакс эррор. Помогите плиз 
shop *listHead=new(shop); //zaglavnoe zveno
shop *last=listHead; //poslednee zveno
(*last).next=NULL;

Автор: borisbn 27.6.2010, 12:13
В этих строчках ошибки не видно. Выкладывай весь код и не забывай пользоваться кнопкой Код

Автор: PriestOfLuna 27.6.2010, 12:31
Код

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <iomanip.h>
 struct shop
 {
  int number;
  char adress[40];
  char type[20];
  shop *next;

  int add();
  void del();
  void search();
  void output();
  void outall();
 };

 shop *listHead=new(shop);  //zaglavnoe zveno
 shop *last=listHead;          //poslednee zveno
 (*last).next=NULL;
 shop *current;                 //tekushee zveno
 int key;

 int shop::add()
 {
  while(1==1)
  {
   last=new(shop);
   last=(*last).next;

   cout<<"number:";
   cin>>(*last).number;

   cout<<"adress:";
   gets((*last).adress);

   cout<<"type:";
   gets((*last).type);

   cout<<"\n";

   (*last).next=NULL;

   cout<<"to add more, press \'a\'";
   switch(getch())
   {
    case'a': break;
    default: return 0;
   }
  }
 }

 void shop::search()
 {
  key=0;
  int flag=0;
  current=listHead;
  if((*current).next==NULL)
   cout<<"List is empty\n";

  else
  {
   cout<<"Enter a key number:";
   cin>>key;

   while((*current).next!=NULL)
   {
     if((*current).number==key)
      {(*current).output();
      flag=1;
      }
   }
   if(flag==0)
    cout<<"Shop not found\n";
  }
 }
 void shop::del()
 {
  shop *previous;
  key=0;

  cout<<"Enter a key number:";
  cin>>key;
  current=(*listHead).next;
  while(current!=NULL)
  {
   if((*(*current).next).number==key)
    {
     previous=current;
     current=(*current).next;
     (*previous).next=(*current).next;
     delete(current);
    }
   current=(*current).next;
  }

 }

 void shop::output()
 {
  cout<<"\nnumber:"<<number;

  cout<<"\ntype:"<<type;

  cout<<"\nadress:"<<adress;
 }

 void shop::outall()
 {
  if((*listHead).next==NULL)
    cout<<"List is empty";
  else
  {
   cout<<"ЪДДДДДДВДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДї\n"; // писалось в borland c++ под DOS, так модно там делается таблица =)
   cout<<"іnumberі    type    і       adress       і\n";
   cout<<"АДДДДДДБДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДЩ\n";
  current=(*listHead).next;
  while(current!=NULL)
  {
   cout<<"і"<<setw(6)<<(*current).number<<"і"<<setw(12)<<(*current).type;
   cout<<"і"<<setw(20)<<(*current).adress<<"і\n";
   cout<<"АДДДДДДБДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДЩ\n";
   current=(*current).next;
  }
  }
 }

 int main()
{shop obj;
clrscr();

while(1==1)
{
clrscr();
cout<<"    1. Add a new element"<<'\n';
cout<<"    2. Delete element"<<'\n';
cout<<"    3. Search"<<'\n';
cout<<"    4. Print all"<<'\n';
cout<<"    q. Exit"<<'\n';

switch(getch())
  {
 case '1': obj.add(); break;
 case '2': obj.del(); break;
 case '3': obj.search(); break;
 case '4': obj.output(); break;
 case 'q': return 0;
  }
 }

}

Автор: W4FhLF 27.6.2010, 12:38
Вот это в main убери:

Код

(*last).next=NULL;

Автор: PriestOfLuna 27.6.2010, 12:59
спасибо! правда почти все методы не работают но это фигня, исправим  smile 
Да, если можно, объясните, почему глобально нельзя присвоить

Автор: borisbn 27.6.2010, 13:12
Цитата

(*last).next=NULL; 

это уже не просто определение переменной и инициализация начальным значением, а строка кода, который может находиться (по стандарту языка ) только внутри какой-нибудь функции.

Вот
Цитата

shop *last=listHead;

это - не просто присвоение, а объявление переменной и инициализация, которые можно делать где угодно.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)