1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

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

  1. Karmen

    Karmen Гость

    Репутация:
    0
    --------------------------------------------------------------------------------

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

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

    F84 Гость

    Репутация:
    0
    Если в кратце... создаем структуру содержащую непосредственно сами данные и указатель на следующие данные (на такую же структуру) или на 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">
    Код:
    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">
    Код:
    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 Гость

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

    #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 Гость

    Репутация:
    0
    Вот новый код проги......Только я теперь не знаю как получить те символы,которые входят в последовательность по одному разу.
    #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 Гость

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

    Karmen Гость

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

    Karmen Гость

    Репутация:
    0
    хм......1 символ????)
     
  8. Karmen

    Karmen Гость

    Репутация:
    0
    ну все.......сдаюсь,сдаюсь))))
     
  9. Karmen

    Karmen Гость

    Репутация:
    0
    )))))Благодарю.....)
    Но вот, возник другой вопрос:у меня есть текс проги.......по двунаправленным спискам.......
    проблема в том,что надо сделать так,чтобы прога выводила последовательность чисел,которую ввел пользователь в таком порядке: 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 Гость

    Репутация:
    0
    Еще одно уточнение.......к предыдущей задаче по однонапрвленным спискам, я исправила немного.....но теперь снова не вывод символы,которые входят только один раз.....
    #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;
    }
     

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