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

  • Автор темы Karmen
  • Дата начала
K

Karmen

Гость
#1
--------------------------------------------------------------------------------

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

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

F84

Гость
#2
--------------------------------------------------------------------------------

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

Как решить эту задачу используя этот непонятный линейный однонапрвленый список???За ранее спасибо!!!
Если в кратце... создаем структуру содержащую непосредственно сами данные и указатель на следующие данные (на такую же структуру) или на 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-я: Вам будет проще понять свою ошибку.
 
K

Karmen

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

#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();
}
 
K

Karmen

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

}
 
K

Karmen

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

Karmen

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

Karmen

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

Karmen

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