Страница 1 из 1
Нужен исходник программы создания односвязного списка С++3.1
Добавлено: 25 июн 2005, 13:10
BAHO
Выложите, плз, исходник НОРМАЛЬНО (без всяких прибамбасов, например сортировки и т.п.) работающей программы на C++ 3.1
СОЗДАНИЯ динамической структуры - односвязного списка; ВВОДА и ВЫВОДА элементов в этот односвязный список. Хотя бы это.
И, если, кому не лень -
ПОИСК в нём элемента с определённой размерностью.
Сроки поджимают.. Буду очень благодарен за быстрый ответ.

З.Ы. ...ещё не выкладывайте пожалуйста алгоритмы решения или функции отдельно - я имел ввиду цельную программу. Дело в том, что я не могу до конца разобраться со списками. :roll:
Добавлено: 27 июн 2005, 07:36
Lei fang
Это программа, организовывающая работу с односвязанным списком, дополнена функцией поиска максимального элемента.
Код: Выделить всё
#include<conio.h>
#include<stdio.h>
#include<dos.h>
struct list
{
int data;
list *next;
}; list *first=0, *cur=0;
int IsEmpty()
{
return first==NULL;
}
void GoToPrev()
{
if(IsEmpty())
{
printf("\nСписок пуст");
getch();
return;
}
if(cur==first)
return;
list *tmp;
tmp=new list;
tmp=first;
while(tmp->next!=cur)
tmp=tmp->next;
cur=tmp;
}
void AddFirst(int val)
{
list *tmp;
tmp=new list;
tmp->data=val;
tmp->next=first;
first=cur=tmp;
}
void AddAfterCur(int val)
{
if(IsEmpty())
{
AddFirst(val);
return;
}
list *tmp;
tmp=new list;
tmp->data=val;
tmp->next=cur->next;
cur->next=tmp;
cur=tmp;
}
int IsEnd()
{
return cur->next==NULL;
}
void Move()
{
if(IsEnd())
{
printf("\nДостигнут конец списка");
getch();
return;
}
cur=cur->next;
}
void GoToFirst()
{
cur=first;
}
int GetElem()
{
return cur->data;
}
void DeleteFirst()
{
list *tmp;
tmp =new list;
tmp=first->next;
delete first;
first=tmp;
}
void DeleteCur()
{
if(IsEmpty())
{
printf("\nСписок пуст. Удаление невозможно");
getch();
return;
}
list *tmp;
tmp=new list;
if(cur==first)
{
DeleteFirst();
return;
}
else
{
tmp=cur;
GoToPrev();
cur->next=tmp->next;
delete tmp;
}
}
void Print()
{
if(IsEmpty())
return;
list *tmp;
tmp=first;
do
{
printf("%3i",tmp->data);
tmp=tmp->next;
}
while(tmp!=NULL);
}
void MaxData(int q)
{
if(first!=0)
{
cur=first;
q=first->data;
do
{
if(q<cur->data)
{
q=cur->data;
cur=cur->next;
}
else
{
cur=cur->next;
}
}
while(cur->next!=0);
if(q<=cur->data)
{
printf("Максимальный элемент равен %i",cur->data);
}
else
{
printf("Максимальный элемент равен %i",q);
}
}
else
{
printf("Список пуст");
}
}
main()
{
first=NULL;
cur->next=NULL;
cur=first;
int q;
char a;
do
{
delay(1000);
clrscr();
int val;
Print();
printf("\nНажмите:\n\t0 - Возврат на предыдущий элемент;\n\t1 - добавление элемента в начало списка;\n\
2 - добавление элемента после текущего;\n\t3 - просмотр элемента;\n\
4 - удаление текущего элемента;\n\t5 - переход к следующему элементу:\n\
6 - переход на начало списка;\n\t7 - проверка достижения конца списка;\n\
8 - проверка пустоты спуска;\n\t9 - Найти максимальный элемент;\n\
Esc - Выход\n");
a=getch();
switch (a)
{
case '1':
printf("\nВведите значение:\n");
scanf("%i",&val);
AddFirst(val);
break;
case '2':
printf("\nВведите значение:\n");
scanf("%i",&val);
AddAfterCur(val);
break;
case '3':
if(IsEmpty())
printf("\nСписок пуст");
else
printf("\nЗначение текущего элемента равно %i",GetElem());
getch();
break;
case '4':
DeleteCur();
break;
case '5':
Move();
break;
case '6':
GoToFirst();
break;
case '7':
if(IsEnd())
printf("\nДостигнут конец списка");
else
printf("\nКонец списка не достигнут");
getch();
break;
case '8':
if(IsEmpty())
printf("\nСписок пуст");
else
printf("\nВ списке есть элементы");
getch();
break;
case '9':
MaxData(q);
break;
case '0':
GoToPrev();
break;
}
}
while (a!=27);
return 0;
}
Дело в том, что я не могу до конца разобраться со списками.
По своему опыту, скажу, лучше бы тебе почитать лекции (если ты их писал, конечно), книжки или какую-нибудь другую информацию по спискам. Одни исходники тебе не очень помогут.
Добавлено: 05 июл 2005, 08:57
Lei fang
Тут же нет ничего нового! Почему мне пришло уведомление об ответе???
Добавлено: 05 июл 2005, 17:20
Serg79
Когда то приходилось делать что то подобное. Должно быть вроде этого, потправиш немного и будет самый раз:
Код: Выделить всё
/***********************************************************************
Шаблонный класс стека.
Создает динамический стек в памяти.
Пример:
struct add {
char name[20];
int i;
add *next;
};
stack<add> a; // Создается стек для структур add.
stack<int> b; // Создается стек для целых чисел.
*********************************************************************
Прототипы Функции:
bool push(объект) - помешает элимент в стек, возвращает true, если
элемент помешенн, и false - в противном случае.
объект pop() - выталкивает элемент из стека, возврашает элимент
стека. Элемент удаляется.
bool empty() - возврашает true, если стек пуст, и false -
в противном случае.
size_stack size() - возврашает текущее количество элементов,
находящихся в стеке.
*********************************************************************
В классе перегружены операторы: = и ==,!=,<,>,<=,>=.
Операторы сравнения сравнивают длину стека.
Функция push() помешает объект в стек. Она возврашает false если
произошла ошивка при помешении объекта в стек.
Если стек пуст функция pop() возвращает 0 (нуль). Но так как 0 (нуль)
будет возврашен так же если он там находится, пример:
stack<int> a;
a.push(12); // заталкиваем 12
a.push(0); // заталкиваем 0
cout << a.pop(); // выталкиваем 0
cout << a.pop(); // выталкиваем 12
по этому для проверки, пуст ли стек или нет нужно использовать
функцию empty(), она возврашает true если стек пуст.
Пример:
stack<int> a;
bool b;
int i;
a.push(12);
cout << "В стеке " << a.size() << " элементов.\n";
// В стеке 1 элементов.
i = a.pop(); // i = 12
cout << "В стеке " << a.size() << " элементов.\n";
// В стеке 0 элементов.
i = a.pop(); // i = 0
i = a.empty(); // i = 1
b = a.empty(); // b = true
i = a.pop(); // i = 0
************************************************************************/
/************************************************************************
Шаблонный класс очереди.
Создает динамическую очередь в памяти.
Работа с очередью происходит точно так же, как и со стеком.
Только принцип стека "Первым вошол, последним вышел", а
очереди "Первым вошол, первым вышел".
Пример:
queue<int> a;
boll b;
int i;
a.push(25);
a.push(12);
b = a.empty(); // b = false
i = a.pop(); // i = 25
i = a.size(); // i = 1
i = a.pop(); // i = 12
i = a.pop(); // i = 0
i = a.empty(); // i = 1
b = a.empty(); // b = true
i = a.pop(); // i = 0
************************************************************************/
#include <cstdlib>
#include <new>
using std::bad_alloc;
typedef unsigned int size_stack;
template <class T=int> class stack
{
struct Type {
T stck;
Type *prior;
};
Type *tos;
size_stack size_stck;
public:
stack();
stack(const stack<T> &a);
~stack();
bool push(const T &i);
T pop();
size_stack size() { return size_stck; }
bool empty() { return (size_stck ? false : true); }
stack<T> operator=(const stack<T> &a);
int operator==(const stack<T> &a) { return (size_stck==a.size_stck ? 1 : 0); }
int operator!=(const stack<T> &a) { return (size_stck!=a.size_stck ? 1 : 0); }
int operator<(const stack<T> &a) { return (size_stck<a.size_stck ? 1 : 0); }
int operator>(const stack<T> &a) { return (size_stck>a.size_stck ? 1 : 0); }
int operator<=(const stack<T> &a) { return (size_stck<=a.size_stck ? 1 : 0); }
int operator>=(const stack<T> &a) { return (size_stck>=a.size_stck ? 1 : 0); }
};
template <class T> stack<T>::stack()
{
try {
tos = new Type;
} catch (bad_alloc xa) {
exit(1);
}
tos->prior = NULL;
size_stck = 0;
}
template <class T> stack<T>::stack(const stack<T> &a)
{
register Type *tmp1, *tmp_a;
try {
tos = tmp1 = new Type;
} catch (bad_alloc xa) {
exit(1);
}
tmp_a = a.tos;
while(tmp_a->prior) {
register Type *tmp2;
tmp_a = tmp_a->prior;
try {
tmp2 = new Type;
} catch (bad_alloc xa) {
exit(1);
}
tmp1->prior = tmp2;
tmp2->stck = tmp_a->stck;
tmp1 = tmp2;
}
tmp1->prior = NULL;
size_stck = a.size_stck;
}
template <class T> stack<T>::~stack()
{
register Type *temp;
do {
temp = tos->prior;
delete tos;
tos = temp;
} while(temp);
}
template <class T> stack<T> stack<T>::operator=(const stack<T> &a)
{
register Type *tmp1, *tmp_a;
do {
tmp1 = tos->prior;
delete tos;
tos = tmp1;
} while(tmp1);
try {
tos = tmp1 = new Type;
} catch (bad_alloc xa) {
exit(1);
}
tmp_a = a.tos;
while(tmp_a->prior) {
register Type *tmp2;
tmp_a = tmp_a->prior;
try {
tmp2 = new Type;
} catch (bad_alloc xa) {
exit(1);
}
tmp1->prior = tmp2;
tmp2->stck = tmp_a->stck;
tmp1 = tmp2;
}
tmp1->prior = NULL;
size_stck = a.size_stck;
return *this;
}
template <class T> bool stack<T>::push(const T &i)
{
register Type *temp;
try {
temp = new Type;
} catch (bad_alloc xa) {
return false;
}
tos->stck = i;
temp->prior = tos;
tos = temp;
size_stck++;
return true;
}
template <class T> T stack<T>::pop()
{
register Type *temp;
if(!tos->prior) return 0;
temp = tos->prior;
delete tos;
tos = temp;
size_stck--;
return tos->stck;
}
/**********************************************************************/
typedef unsigned int size_queue;
template <class T=int> class queue
{
struct Type {
T que;
Type *next;
};
Type *first;
Type *last;
size_queue size_que;
public:
queue();
queue(const queue<T> &a);
~queue();
bool push(const T &i);
T pop();
size_queue size() { return size_que; }
bool empty() { return (size_que ? false : true); }
queue<T> operator=(const queue<T> &a);
int operator==(const queue<T> &a) { return (size_que==a.size_que ? 1 : 0); }
int operator!=(const queue<T> &a) { return (size_que!=a.size_que ? 1 : 0); }
int operator<(const queue<T> &a) { return (size_que<a.size_que ? 1 : 0); }
int operator>(const queue<T> &a) { return (size_que>a.size_que ? 1 : 0); }
int operator<=(const queue<T> &a) { return (size_que<=a.size_que ? 1 : 0); }
int operator>=(const queue<T> &a) { return (size_que>=a.size_que ? 1 : 0); }
};
template <class T> queue<T>::queue()
{
try {
first = last = new Type;
} catch (bad_alloc xa) {
exit(1);
}
last->next = NULL;
size_que = 0;
}
template <class T> queue<T>::queue(const queue<T> &a)
{
register Type *temp_a;
try {
first = last = new Type;
} catch (bad_alloc xa) {
exit(1);
}
temp_a = a.first;
while(temp_a->next) {
register Type *temp;
try {
temp = new Type;
} catch (bad_alloc xa) {
exit(1);
}
last->next = temp;
last->que = temp_a->que;
temp_a = temp_a->next;
last = temp;
}
last->next = NULL;
size_que = a.size_que;
}
template <class T> queue<T>::~queue()
{
register Type *temp;
do {
temp = first->next;
delete first;
first = temp;
} while(temp);
}
template <class T> queue<T> queue<T>::operator=(const queue<T> &a)
{
register Type *temp_a;
do {
temp_a = first->next;
delete first;
first = temp_a;
} while(temp_a);
try {
first = last = new Type;
} catch (bad_alloc xa) {
exit(1);
}
temp_a = a.first;
while(temp_a->next) {
register Type *temp;
try {
temp = new Type;
} catch (bad_alloc xa) {
exit(1);
}
last->next = temp;
last->que = temp_a->que;
temp_a = temp_a->next;
last = temp;
}
last->next = NULL;
size_que = a.size_que;
return *this;
}
template <class T> bool queue<T>::push(const T &i)
{
register Type *temp;
try {
temp = new Type;
} catch (bad_alloc xa) {
return false;
}
last->que = i;
last->next = temp;
temp->next = NULL;
last = temp;
size_que++;
return true;
}
template <class T> T queue<T>::pop()
{
Type temp;
if(!first->next) return 0;
temp = *first;
delete first;
first = temp.next;
size_que--;
return temp.que;
}
Тип данных с которыми работают эти два класса могут быть любыми, от встроенного типа до типа определенного пользователем (структуры, объекты и т.п.).