Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2012, 15:22   #1
Jess Mailes
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 10
По умолчанию Двусвязный список

Не понимаю почему при заполнении списка,после заполнения первого элемента, долее список заполняется не тем, что я ввожу с клавиатуры, а значением первого элемента, помогите.

Код:
#include <iostream>
#include <stdio.h>
using namespace std;
struct list                            // структура
{
	int inf;
	list *right;
	list *left;
};
void add_end(list *&first,int e_et);
int main()
{
	list *first = new list;
	first = NULL;                                         //инициализация
	int i;                                                   //начиная с этого места пытаюсь заполнить список
	printf("Ведите элементы списка\n");
	scanf("%d",&i);
	while(i)
	{
		add_end(first,i);
		scanf("%d",&i);
	}
	list *t = first;  
	while(t) //печать списка
	{
		printf("%d ",first->inf);
		t=t->right;
	}
	return 0;
}
void add_end(list *&first, int e_et)                       //добавление элемента в конец списка
{
	list *e;
	e=new list;
	e->inf=e_et;
	e->right=NULL;               //формируем элемент
	if (first==NULL)                 //добавляем, если это первый элемент в списке
	{
		first=e;
		first->left=NULL;
		return;
	}
	list *t;
	t=first;
	while (t->right)                //если не первый элемент в списке
		t=t->right;
	t->right=e;                     // добавляем элемент
	e->left=t;
}

Последний раз редактировалось Stilet; 02.06.2012 в 19:57.
Jess Mailes вне форума Ответить с цитированием
Старый 02.06.2012, 18:05   #2
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

Хотел поправить, но потом решил переписать заново.
Немного по задаче:
1)Использования классов облегчает выполнение многих задач.
2)Работа с двухсвязным списком намного упрощается, если в начало и конец списка вставить пустые элементы.
Старался все подробно расписать. Если что-то не понятно обращайтесь.

Код:
#include <iostream>

using namespace std;
/* структура представляет узел списка*/ 
struct Node 
{
	int Data;
	Node *Next;
	Node *Prev;
};
/*класс представляет связный список*/
class MyLinkedList{
	Node *Begin;	//начало и конец списка
	Node *End;	

public:
	int PushBack(int Data);//добавить элемент
	int DataOut();//вывести на монитор для упрощения не используем oprator <<
	int Free();//очистить список

	MyLinkedList();//конструктор
	~MyLinkedList(){Free();};

};
int main(){
	/*пример работы со списком */
	MyLinkedList Test;// создаем объект типа связный список
	
	for(int i = 0;i<10;i++)
		Test.PushBack(rand()%25);//добавляем элементы в список
	Test.DataOut();//выводим на монитор

	system("pause");
	return 0;
}

//чтоб упростить задачу используем два пустых элемента
MyLinkedList::MyLinkedList(){
	Begin=new Node;
	End=new Node;
	/* связуем два элемента в месте*/
	Begin->Next= End;
	Begin->Prev=NULL;
	End->Next=NULL;
	End->Prev=Begin;
}

/*добавления в конец списка нового элемента*/
int MyLinkedList::PushBack(int data){
	Node *Add = new Node;//создали новый элемент 
	Add->Data=data;//заполнили поя

	/*связали елемент со списком*/
	Add->Prev=End->Prev;
	Add->Next=End;
	
	End->Prev->Next=Add;
	End->Prev=Add;

	return 0;
}

/*Вывод списка на монитор*/
int MyLinkedList::DataOut(){
	Node *tmp=Begin->Next;//элемент который выводим 

	while(tmp != End){//пока не дошли до конца 
		cout<<tmp->Data<<'\t';
		tmp=tmp->Next;//к след элементу
	}
	cout<<endl;
	return 0;
}
/*Очистка списка */
int MyLinkedList::Free(){
	Node *tmp ;

	while(Begin!=NULL){
		tmp=Begin;
		Begin=Begin->Next;//переходим к след 
		delete tmp;// удаляем предыдущий
	}
	return 0;
}
_kilik_ вне форума Ответить с цитированием
Старый 02.06.2012, 20:13   #3
Jess Mailes
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 10
По умолчанию

проблема в том, что я у меня классы начнутся только на втором курсе, поэтому я мало что понимаю из вашего кода, можете показать мне ошибку в моём коде, чтобы
я исправила её?
Jess Mailes вне форума Ответить с цитированием
Старый 02.06.2012, 21:50   #4
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

Код:

#include <iostream>
#include <stdio.h>
using namespace std;
struct list                            // структура
{
	int inf;
	list *right;
	list *left;
};
void add_end(list *first,int e_et);
int main()
{
	list *first = new list;
	first->right=NULL;
	//first = NULL;                                         //инициализация
	int i;                                                   //начиная с этого места пытаюсь заполнить список
	printf("Ведите элементы списка\n");
	scanf("%d",&i);
	while(i)
	{
		add_end(first,i);
		scanf("%d",&i);
	}
	list *t = first->right;  
	while(t) //печать списка
	{
		printf("%d\t",t->inf);
		t=t->right;
	}
	system("pause");
	return 0;
}
void add_end(list *first, int e_et)                       //добавление элемента в конец списка
{
	
	while (first->right!=NULL){// проходим по списку
		first= first->right;
	} 
	list *e;
	e=new list;
	e->inf=e_et;
	e->right=NULL;               //формируем элемент
	first->right=e;
	return ;
}
_kilik_ вне форума Ответить с цитированием
Старый 03.06.2012, 19:38   #5
Jess Mailes
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 10
По умолчанию

что значит
system("pause");

и \t в строке
printf("%d\t",t->inf); ?

Последний раз редактировалось Jess Mailes; 03.06.2012 в 19:43.
Jess Mailes вне форума Ответить с цитированием
Старый 03.06.2012, 19:57   #6
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

system("pause"); -> передает в командую строку команду “pause” – ожидания нажатия любой клавиши
\t –> символ табуляции. При выводе разделяет элементы массива.
_kilik_ вне форума Ответить с цитированием
Старый 03.06.2012, 21:47   #7
Jess Mailes
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 10
По умолчанию

спасибо за помощь)
Jess Mailes вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязный Список. loki_man Паскаль, Turbo Pascal, PascalABC.NET 2 23.02.2012 22:59
Двусвязный список narcot Visual C++ 13 28.05.2011 21:12
Двусвязный список decantnik Паскаль, Turbo Pascal, PascalABC.NET 0 09.05.2011 00:58
двусвязный список Work Group Помощь студентам 0 24.05.2010 21:27
двусвязный список klykovka Помощь студентам 8 22.05.2010 18:58