Линейные односвязаные списки

Тема в разделе "C/C++/C#", создана пользователем Karmen, 21 апр 2010.

  1. Karmen

    Karmen Гость

    --------------------------------------------------------------------------------

    Ребята,кто-нибудь может меня прошарить в этих линейных однонаправленых списках????Ничего не могу понять с ними......запуталась с указателями.....
    Вобщем задача такая:
    Дать возможность пользователю задать последовательность символов s1, s2,.......sn (n>=2 и наперед неизвестно). Получить те символы,которые входят в последовательность по одному разу.

    Как решить эту задачу используя этот непонятный линейный однонапрвленый список???За ранее спасибо!!!
     
  2. F84

    F84 Гость

    Если в кратце... создаем структуру содержащую непосредственно сами данные и указатель на следующие данные (на такую же структуру) или на NULL если это последний либо единственный эл. списка.
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"обьявляем структуру"</div></div><div class="sp-body"><div class="sp-content">
    Код (C++):
    struct myList {
    int value; // значение
    myList* next; // указательна след. элемент списка, либо на NULL
    // если это ед-ный или последний эл. списка
    };
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Добавление нового элемента в список"</div></div><div class="sp-body"><div class="sp-content">
    Код (C++):
    myList* Add(myList* pbeg, int n) {
    myList* tmp = new (myList);
    tmp->value = n;
    if (pbeg) tmp->next = pbeg;
    return tmp;
    };

    //Вызов функции:
    myList* pbeg = Add(pbeg, n);    // pbeg указывает на начало списка.

    ну а искать не повторяющиеся в цикле, проверяя указатель ->next, либо, как вариант, добавить счетчик элементов в функцию добавления элементов.

    Вы бы привели свой код, пусть даже он не верный, это хорошо по 2 причинам:
    1-я: проще поправить ошибку уже в готовом коде, нежели писать все с нуля
    2-я: Вам будет проще понять свою ошибку.
     
  3. Karmen

    Karmen Гость

    Плюс ко всему нужно еще создать заголовочное звено......Не понимаю..пишет ошибку,что у меня необьявленная переменная....

    #include <stdio.h>
    #include <math.h>
    #include <iostream.h>
    #include <conio.h>

    void main(){
    struct List {
    List *t;
    int el;} **phead;
    *phead = new (List);
    t= *phead;
    (*t).sled = NULL;
    cout<<"Chislo: ";
    cin>>el;
    while (el!=0)
    {
    (*t).sled = new (List); t = (*t).sled;
    (*t).elem = el; (*t).sled = NULL;
    cin>>el;
    }
    getch();
    }
     
  4. Karmen

    Karmen Гость

    Вот новый код проги......Только я теперь не знаю как получить те символы,которые входят в последовательность по одному разу.
    #include<iostream.h>
    #include<conio.h>
    #include<math.h>
    struct List
    {
    char value;
    List *next;
    };

    void main ()
    { int j;
    char i;
    List *phead, *t;
    clrscr();
    phead = new (List);
    t = phead;
    (*t).value = NULL;
    cout<<"Vvedit symvolu(a--oznachae kinec spisky): ";
    cin>>i;
    while (i!='a')
    {
    (*t).next = new (List);
    t = (*t).next;
    (*t).value = i;
    (*t).next = NULL;
    cin>>i;

    }

    getch();

    }
     
  5. Karmen

    Karmen Гость

    хм...)Пасиб........)
    Только никак не пашет......!Не знаю в чем там дело
     
  6. Karmen

    Karmen Гость

    мм...эта прога выводит наоборот те символы,которые повторяются......и как переделать???)
     
  7. Karmen

    Karmen Гость

    хм......1 символ????)
     
  8. Karmen

    Karmen Гость

    ну все.......сдаюсь,сдаюсь))))
     
  9. Karmen

    Karmen Гость

    )))))Благодарю.....)
    Но вот, возник другой вопрос:у меня есть текс проги.......по двунаправленным спискам.......
    проблема в том,что надо сделать так,чтобы прога выводила последовательность чисел,которую ввел пользователь в таком порядке: y1,y2,......yn,y1,y2,.............,yn.
    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <iostream.h>
    struct List2
    { int elem;
    List2 *sled;
    List2 *pred; };
    int main ()
    { int i;
    List2 *rsp, *nsp, *ksp, *tt;
    clrscr();
    nsp= new (List2);
    *rsp = *nsp;
    (*nsp).pred = (*nsp).sled = NULL;
    cout<<"Chisla:\n";
    cin>>i;
    while (i!=0)
    { (*rsp).sled = new(List2); (*((*rsp).sled)).pred = rsp;
    rsp = (*rsp).sled; (*rsp).sled = NULL; (*rsp).elem = i;
    cin>>i; }
    *ksp =* rsp;
    getch();
    return 0;}
     
  10. Karmen

    Karmen Гость

    Еще одно уточнение.......к предыдущей задаче по однонапрвленным спискам, я исправила немного.....но теперь снова не вывод символы,которые входят только один раз.....
    #include<iostream.h>
    #include <conio.h>
    struct List
    {
    char value;
    List *next;
    };

    int main ()
    { int j, k;
    char i;
    List *phead, *t, *tt;
    clrscr();
    phead = new (List);
    t = phead;
    t->value = NULL;
    cout<<"Vvedit n>2:\n";
    cin>>k;
    cout<<"Vvedit symvolu:\n";
    j=0;
    while (j<k)
    {
    t->next = new (List);
    t = (*t).next;
    t->value = i;
    t->next = NULL;
    cin>>i;
    j++;
    }
    for(t=phead->next; t; t=t->next){
    for(tt=phead->next; tt; tt=tt->next)
    if(tt->value==t->value&&tt!=t) break;
    if(!tt) cout<<t->value;};
    getch();
    return 0;
    }
     

Поделиться этой страницей