Удаление из линейного однонаправленного списка.

Тема в разделе "WASM.BEGINNERS", создана пользователем Luna, 17 май 2010.

  1. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    TermoSINteZ
    А-а, ну да :) извиняюсь.
     
  2. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Microedition
    ничего страшного- пригодится)))
     
  3. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    В хозяйстве пулемет на лишний ))
     
  4. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Dian
    был бы и не пулемётом- всё-равно б не помешал =)..............

    ___________________________________________________________________________
    Нет, ну серьёзно- классичесукий вариант удаления слова из середины таков:
    -...удаляем его при помощи delete и сцепляем соседей этого удалённого слова...
    -------------------------------------------------------------------------------------------
    Как можно сделать п о - д р у г о м у...?????????Может, осуществить сдвиг всех элементов на одну позицию влево9 ближе к началу)?......................
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Luna
    Не путай связанные списки с текстом. Элементы списка это не слова и не буквы всегда физически расположенные друг за другом, а информационные блоки которые физически могут располагаться как угодно, например у тебя два списка A1, A2, A3, ... и B1, B2, B3,...
    В памяти компа это может быть вот таким винигретом:
    В1, A2, Cxx, B2, B3, Cxx, A3, Cxx, A1, ..., где Схх совершенно посторонние данные.
    Связанность (правильное построение последовательности) в списках достигается не перемещениями элементов (это слишком накладно) а ссылками с элемента на элемент. Поэтому и варианты перекомпоновки списка тут совсем не те-же что в просто тексте.
     
  6. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Y_Mur
    ну, значит, я хотела сказать- установить ссылку между соседями удалённого элемента..;)
    Вы доступно объясняете - спасибо..=)
    но всё-равно- списки-..довольно тяжёлая тема, чтобы вот так взять да придумать новый метод удаления элемента
    -------------------------------------------------------------------------------------------------------------------
     
  7. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Что надо исправить в этом коде, чтобы он н о р м а л ь н о удалял элементы списка, а не заменял их буквенной кашей??????????????????????????????..............................

    Код (Text):
    1.   void los::del_el( )
    2. {
    3.  
    4.                 los  *head=p;
    5.         los *item=0;
    6.  
    7.         int key;
    8.                 cout << "vvedite key: ";
    9.     cin >> key;
    10.     if(key==0)
    11.     {
    12.         p=p->next;
    13.         delete head;
    14.  
    15.         return ;
    16.     }
    17.     else
    18.     {
    19.         for(int i=1;i<n;i++)
    20.             p=p->next;
    21.         item=p->next;
    22.         p->next=p->next->next;
    23.         delete item;
    24.         return ;
    25.     };
    26. }
     
  8. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Почему метод удаления в следующей задаче не работает так, как надо? в чём ошибка?

    Код (Text):
    1. #include <iostream.h>
    2. #include <conio.h>
    3. #include <stdio.h>
    4. #include <fstream.h>
    5. #include <iomanip.h>
    6. #define n 3
    7.  
    8. class los
    9. {
    10.     char aa[20], tt[50];
    11.     int nn, k;
    12.     los *next;
    13.  
    14.     public:
    15.     static los *p;
    16.         los *prev;
    17.     void create();
    18.     void output();
    19.     void search();
    20.     void del_el();
    21.     void add_el();
    22.     int save();
    23.     int loadf();
    24. };
    25.  
    26.     los *los::p;
    27.  
    28. void los::create()
    29. {
    30.     los *q;
    31.     clrscr();
    32.     p=new los;
    33.  
    34.     cout<<"\n";
    35.     cout << "Key: ";
    36.     cin >> p->k;
    37.     cout << "adres: ";
    38.     gets(p->aa);
    39.     cout <<" nomer: ";
    40.     cin >> p->nn;
    41.  
    42.     cout << "tip: ";
    43.     gets(p->tt);
    44.  
    45.     q=p;
    46.  
    47.     for(int i=0; i<n-1; i++)
    48.     {
    49.         q->next=new los;
    50.         q=q->next;
    51.         cout<<"\n";
    52.         cout << "Key: ";
    53.         cin >> q->k;
    54.         cout << "adres: ";
    55.         gets(q->aa);
    56.         cout << "nomer: ";
    57.         cin >> q->nn;
    58.  
    59.         cout << "tip: ";
    60.         gets(q->tt);
    61.      };
    62.     q->next=NULL;
    63.  
    64. }
    65.  
    66. void los::output()
    67. {
    68.     los *q;
    69.     clrscr();
    70.     q=p;
    71.  
    72.     cout<<"\n";
    73.     cout <<  "і Key      і      adres     і     nomer  і       tip  і";
    74.  
    75.     cout<<"\n";
    76.     cout<<"---------------------------------------------------------"   ;
    77.      cout<<"\n";
    78.     while(q!=NULL){
    79.             cout<< setw(10) << q->k << "  ";
    80.  
    81.               cout  << setw(10) << q->aa << "  "  ;
    82.  
    83.              cout   << setw(10) << q->nn << "  " ;
    84.  
    85.              cout   << setw(10) << q->tt << "  ";
    86.               cout<<"\n";
    87.  
    88.         q=q->next;
    89.         };
    90.  
    91.  
    92.  
    93. }
    94.  
    95. int los::save()
    96. {
    97.     ofstream out ("SRISOK");
    98.  
    99.     if(!out)
    100.     {
    101.       cout<<"the file can't be created\n";
    102.       return 1;
    103.     }
    104.     los *q;
    105.     q=p;
    106.  
    107.     while(q!=NULL){
    108.         out << q->k << " ";
    109.         out <<  q->aa << " ";
    110.         out << q->nn << " ";
    111.  
    112.         out << q->tt << " ";
    113.         q=q->next;
    114.     };
    115.     out.close();
    116.  
    117.     cout << "\nThe file is created\n";
    118.  
    119.     return 0;
    120. }
    121.  
    122.  
    123. int los::loadf()
    124. {
    125.     clrscr();
    126.     ifstream in ("SPISOK");
    127.     if(!in)
    128.     {
    129.       cout<<"the file does not exist\n";
    130.       return 1;
    131.     }
    132.     los *q;
    133.     p=new los;
    134.     in >> p->k;
    135.     in >> p->aa;
    136.     in >> p->nn;
    137.     in >> p->tt;
    138.  
    139.  
    140.     q=p;
    141.  
    142.     for(int i=0; i<n-1; i++)
    143.     {
    144.         q->next=new los;
    145.         q=q->next;
    146.         in >> q->k;
    147.         in >> q->aa;
    148.         in >> q->nn;
    149.  
    150.         in >> q->tt;
    151.     };
    152.     q->next=NULL;
    153.     in.close();
    154.     cout<<"the file is readed\n";
    155.  
    156.     return 0;
    157. }
    158.  
    159. void los::search()
    160. {
    161.  
    162.     los *q;
    163.  
    164.     int key;
    165.  
    166.  
    167.     cout << "\n vvedite key ";
    168.     cin >> key;
    169.     q=p;
    170.     do{
    171.     if  ( q->k == key )
    172.     {
    173.         cout <<"\n";
    174.         cout <<  "і Key       і     adres     і nomer     і       tip  і";
    175.         cout<<"\n";
    176.         cout<<"---------------------------------------------------------";
    177.         cout <<"\n";
    178.         cout <<"і"<< setw(10) << q->k << "  "
    179.               << setw(10) << q->aa << "  "
    180.               << setw(10) << q->nn << "  "
    181.  
    182.               << setw(10) << q->tt << "  ";
    183.                cout<<"\n";
    184.  
    185.     };
    186.     q=q->next;
    187.     }
    188.     while(q!=NULL);
    189.  
    190. }
    191.  
    192.  
    193. void los::add_el()
    194. {
    195.  
    196.     los *q;
    197.     q=p;
    198.     while(q->next!=NULL)
    199.     q=q->next;
    200.     q->next=new los;
    201.     q=q->next;
    202.     cout<<"\n";
    203.     cout << "\nKey: ";
    204.     cin >> q->k;
    205.     cout << "adres: ";
    206.     gets(q->aa);
    207.     cout << "nomer: ";
    208.     cin >> q->nn;
    209.  
    210.     cout << "tip: ";
    211.     gets(q->tt);
    212.  
    213.     q->next=NULL;
    214.     clrscr();
    215.  
    216. }
    217.  
    218.  
    219. [b]  
    220. void los::del_el()
    221. {
    222.     los *q;
    223.  
    224.     int key;
    225.  
    226.  
    227.     cout << "\n vvedite key ";
    228.     cin >> key;
    229.  
    230.     q=p;
    231.        for(int i=1;i<key;i++)
    232.       q=q->next;
    233.       los *q1=q->next, *q2=q->prev;
    234.       if (q==p)
    235.         {
    236.          q1->prev=q2;
    237.          q2->next=q1;
    238.          q->next=NULL;
    239.          q->prev=NULL;
    240.          delete q;
    241.          p=q1;
    242.          q1=NULL; q2=NULL;}
    243.       else
    244.         {
    245.          q1->prev=q2;
    246.          q2->next=q1;
    247.          q->next=NULL;
    248.          q->prev=NULL;
    249.          delete q;
    250.          q1=NULL;q2=NULL;}
    251.          return;
    252.    };
    253.  
    254.  
    255. [/b]
    256.  
    257.  
    258.  
    259.  
    260.  
    261.  
    262. void menu()
    263.  
    264.  
    265. {
    266.     cout<<"  menu ";
    267.     cout<<"\n";
    268.     cout << "1. cozdanie spiska\n";
    269.     cout << "2. Load from file\n";
    270.     cout << "3. Save in file\n";
    271.     cout << "4. Output on screen\n";
    272.     cout << "5. poisk\n";
    273.     cout << "6. dobavlenie\n";
    274.     cout << "7. udalenie\n";
    275.     cout << "8. vichod\n";
    276. }
    277.  
    278.  
    279. void main()
    280. {       clrscr();
    281.     los ob;
    282.     char p;
    283.     menu();
    284.     cout<<"\n";
    285.     while(p!='8'){
    286.         p=getch();
    287.         switch (p) {
    288.             case '1': ob.create(); clrscr(); ob.output(); menu(); break;
    289.             case '2': ob.loadf() ; ob.output(); menu(); cout <<"\nFile is loader"; break;
    290.             case '3': ob.save(); break;
    291.             case '4': ob.output(); menu(); break;
    292.             case '5': ob.search(); break;
    293.             case '6': ob.add_el(); ob.output(); menu(); break;
    294.             case '7': ob.del_el(); ob.output(); menu(); break;
    295.  
    296.             };
    297.      };
    298.  
    299.  
    300.  
    301.  
    302.  
    303.  
    304. }
     
  9. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Что не так в этом идеальном коде, что программа не работает???

    Код (Text):
    1. void shop::cut()
    2. {
    3.     shop *q;
    4.     shop *z,*e,*a;
    5.     int key;
    6.  
    7.     cout << "\n vvedite key ";
    8.     cin >> key;
    9.  
    10.     q=p;
    11.  
    12.          do
    13.     {   q=q->next;
    14.        if(q->b==key)
    15.  
    16.          {
    17.         if(q==p)
    18.           {p->next=q;
    19.            q->next=z;
    20.            p->next=z;
    21.            delete q;return;}
    22.  
    23.         else if(q==NULL)
    24.           {a=p;
    25.           while(a->next!=q)
    26.              {a=a->next;
    27.               if (a->next==q)
    28.             {a=NULL;
    29.              delete q;
    30.              return; }
    31.               }
    32.                    }
    33. }
    34.  
    35.         else
    36.           {a=p;
    37.           while(a->next!=q)
    38.              {a=a->next;
    39.               if (a->next==q)
    40.             {q->next=z;
    41.              a->next=z;
    42.              
    43.  
    44.              delete q;
    45.              return;}
    46.              }
    47.           }
    48.  
    49.  
    50.  
    51.  
    52.  
    53.       }
    54.     while(q!=NULL&&q->b!=key);
    55.    }