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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2010, 23:33   #1
CHUCKe
 
Регистрация: 07.11.2010
Сообщений: 5
По умолчанию надо сделать дек через массив и через список.

надо сделать дек через массив и через список.
рабоатет криво как-то

через массив
Код:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <stdlib.h>

#define maxn 100
 
typedef struct 
{
        int a[maxn];//ìàññèâ çíà÷åíèé
        int dt,dh; //óêàçàòåëè íà ãîëîâó è íà õâîñò
}deque;

 
int kt=0; //äëÿ íåèçâëå÷åíèÿ
int kh=0; //äëÿ íåèçâëå÷åíèÿ
int nowh=0;//êàêàÿ òåïåðü ãîëîâà
int nowt=0;//êàêîé òåïåðü õâîñò




void push_back(deque *d,int x)
{
	if (d->dt<0) d->dt=maxn-1;//åñëè äîïóñòèì èçâëåêàëè
	//çàïèñàòü ýëåìåíò òóäà óêàçûâàåò óêàçàòåëü	
	d->a[(d->dt)%maxn]=x;//çàïèñàòü ýëåìåíò
	d->dt++;//ïåðåìåñòèòü óêàçàòåëü íà íîâóþ ïîçèöèþ
	nowt=d->dt;//óêàçâàåò ëè íà ýëåìåíò èëè íà ïóñòîòó
}

void push_front(deque *d,int x)
{
	if (d->dh<0) d->dh=maxn-1;
	d->a[(d->dh)%maxn]=x;//çàïèñàòü â ïîçèöèþ ýëåìåíò 
	d->dh--;//óêàçàòåëü òåïåðü íè íà ÷åì
	nowh=d->dh;//óêàçûâàåò ëè íà ýëåìåíò ëèáî íà ïóñòîòó
}



void show_back(deque *d)//ïðîñìîòð ñ êîíöà
{
  kt=nowt;
  kh=nowh;
  while (kt!=kh)
  {
  	if (kt<0) kt=maxn-1;
  	cout<<d->a[kt%maxn]<<" ";
  	kt--;
  }
}


void show_front(deque *d)
{
	kt=nowt;
	kh=nowh;
	while (kh!=kt)
	{
	 if (kh==maxn) kh=0;
	 cout<<d->a[kh%maxn]<<" ";
	 kh++;
	}
}


int pop_back(deque *d)
{
	if (d->dt<0) d->dt=maxn-1;
	nowt=d->dt--;
	return d->a[nowt%maxn];
}

int pop_front(deque *d)
{
	if (d->dh==maxn) d->dh=0;
	nowh=d->dh++;//ðàç äàëåå óâåëè÷èòñÿòî íàäî óâåëè÷èòü ñåé÷àñ
	return d->a[(d->dh++)%maxn];
}
	 
 
int main()
{
		deque k;
		k.dt=0;//óêàçûâàåò íà 0 õâîñò
		k.dh=0;//ïîñëåäíèé ýëåìåíò èäåò ñðàçó çà ïðåäûäóùèì
				
		memset(k.a,0,maxn);//÷òîáû íóëè ïðîñòàâèòü
		
		while(0<1)
        {
        	system("cls");
			cout<<"Insert in front----1"<<endl;
            cout<<"Insert into back---2"<<endl;
            cout<<"Show back----------3"<<endl;
            cout<<"Show front---------4"<<endl;
            cout<<"Pop bacj-----------5"<<endl;
            cout<<"pop front----------6"<<endl;
            int el;
            cin>>el;
            switch(el)
            {
            	case 1:
            	{
            		system("cls");
					int elem;
            		cin>>elem;
            		push_front(&k,elem);
            		break;
            	}
            	case 2:
            	{
            		system("cls");
					int elem;
            		cin>>elem;
            		push_back(&k,elem);
            		break;
            	}
            	case 3:
            	{
            		system("cls");
      	            show_back(&k);
      	            getchar();
      	            break;
            	}
            	case 4:
            	{
                    system("cls");
					show_front(&k);
					getchar();
					break;
            	}
            	case 5:
            	{
            		system("cls");
            		cout<<pop_back(&k)<<endl;
            		getchar();
            		break;
            	}
            	case 6:
            	{
            		system("cls");
            		cout<<pop_front(&k)<<endl;
            		getchar();
            		break;
            	}
            }
        }    
		return 0;
}

Последний раз редактировалось CHUCKe; 17.11.2010 в 23:37.
CHUCKe вне форума Ответить с цитированием
Старый 17.11.2010, 23:34   #2
CHUCKe
 
Регистрация: 07.11.2010
Сообщений: 5
По умолчанию

через указатели

Код:
#include <iostream.h>
#include <stdlib.h>
#include  <stdio.h>

//äåê ðåàëèçîâûâàåòñÿ â äàííîì ñëó÷àå ÷åðåç äâóíàïðàâëåííûé ñïèñîê

struct deque
{
	int val;
    deque *prev,*next;
};

deque *head=0,*tail=0;

void insertnach(int x)
{ 
  deque *tmp1=new deque;//ñîçäàåì íîâûé ýëåìåíò
  tmp1->val=x;//â ïîëå äàííûõ âïèñûâàåì çíà÷åíèå
  if (head==0)
  {
  	head=tmp1;//åäèíñòâåííûé ýëåìåíò ïîêà è íà÷àëî
  	tail=tmp1;//è õâîñò
  	head->prev=0;//çàíóëÿåì ññûëêè
  	tail->next=0;
  }
  else
  {
  	head->prev=tmp1;//ýëåìåíò ïåðåä ãîëîâîé íîâûé
  	tmp1->next=head;//ýëåìåíò íîâûé èäåò ïåðåä ñòàðûì
  	head=tmp1;//íîâàÿ ãîëîâà íîâûé ýëåìåíò
  	head->prev=0;
  }
}

void insertlast(int x)
{
	deque *tmp=new deque;//ñîçäàåì ýëåìåíò
	tmp->val=x;
	if (tail==0)//åñëè ïóñòîé äåê
	{
		head=tmp;//ýëåìåíò è ãîëîâà
		tail=tmp;//è õâîòñ
        //çàíóëÿåì ññûëêè
		head->prev=0;
		head->next=0;
		
	}
	else
    {
		tail->next=tmp;//ñëåäóþùèé ýëåìåíò çà  õâîñòîì íîâûé
		tmp->prev=tail;//äëÿ íîâîãî ýëåìåíòà ïðåäûäóùèé - õâîñò
		tail=tmp;//õâîñò íîâûé ýëåìåíò
		tail->next=0;
	}
}

void showfront()
{
	deque *el;
	el=head;
	while(el!=0)//èäåì äî óêàçàòåëÿ íà ïóñòîòó
	{
		cout<<el->val<<" ";
		el=el->next;//äâèãàåì ïî óêàçàòåëÿì
	}
}

void showback()
{
	deque *el1;
	el1=tail;
	while(el1!=0)//èäåì äî óêàçàòåëÿ íà ïóñòîòó
	{
		cout<<el1->val<<" ";
		el1=el1->prev;
	}
}

void popfront()//èçâëå÷åíèå ñ íà÷àëà
{
	if (head==tail)
	{
		cout<<head->val<<endl;
		delete head;
		delete tail;
	}
	else
	{
	 deque *el2;
	 el2=head;//çíà÷åíèå óäàëÿåìîãî
	 cout<<head->val<<endl;
	 head=head->next;//íîâàÿ ãîëîâà áûâøèé ñëåäóþùèé ýëåìåíò
	 head->prev=0;//äàëåå ïóñòîòà
	 delete el2;
	}
}

void popback()
{
     if (head==tail)//åñëè îäèí èëè íåò âîîáùå
     {
     	cout<<tail->val<<endl;
        delete head;
     	delete tail;
     }
     else
     {
     	deque *el3;
     	el3=tail;
     	cout<<tail->val<<endl;
     	tail=tail->prev;//ïåðåìåùàåìñÿ ïî ññëûêå íàçàä
     	tail->next=0;
     	delete el3;
     }
}

void clean()
{
	deque *del;
	while(head!=0)//ïîêà íå î÷èñòèòñÿ
	{
	  del=head; //ïðèñâàåì çíà÷åíèå ãîëîâå
	  head=head->next;//èçìåíÿì ãîëîâó
	  delete del;//óäàëÿåì ýëåìåíò ãîëîâà
	}
}
	
	
int main()
{
	while(0<1)
        {
        	system("cls");
			cout<<"Insert in front----1"<<endl;
            cout<<"Insert into back---2"<<endl;
            cout<<"Show back----------3"<<endl;
            cout<<"Show front---------4"<<endl;
            cout<<"Pop back-----------5"<<endl;
            cout<<"Pop front----------6"<<endl;
            int el;
            cin>>el;
            switch(el)
            {
            	case 1:
            	{
            		system("cls");
					int elem;
            		cin>>elem;
            		insertnach(elem);
            		break;
            	}
            	case 2:
            	{
            		system("cls");
					int elem;
            		cin>>elem;
            		insertlast(elem);
            		break;
            	}
            	case 3:
            	{
            		if ((head==0)&&(tail==0))
            		{
            			system("cls");
						cout<<"It's free"<<endl;
            			getchar();
            			break;
            		}
					system("cls");
      	            showback();
      	            getchar();
      	            break;
            	}
            	case 4:
            	{
                    if ((head==0)&&(tail==0))
                    {
                      system("cls");
					  cout<<"It's free"<<endl;
                      getchar();
                      break;
                    }
					system("cls");
					showfront();
					getchar();
					break;
            	}
            	case 5:
            	{
            		system("cls");
            		popback();
            		cout<<"one element poped"<<endl;
            		getchar();
            		break;
            	}
            	case 6:
            	{
            		system("cls");
            		popfront();
            		cout<<"One element poped"<<endl;
            		getchar();
            		break;
            	}
            }
        }    
	clean();
}

Последний раз редактировалось CHUCKe; 17.11.2010 в 23:37.
CHUCKe вне форума Ответить с цитированием
Старый 18.11.2010, 09:14   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Предлагаю через массив такую деку
Код:
// Очереди и деки.cpp: определяет точку входа для консольного приложения.
//http://www.programmersforum.ru/showthread.php?t=122415

#include "stdafx.h"
const int n=100;
class TDeck{
private:
	int arr[n],deckrear;
public:
	bool eof;
	void push(int i){
		if(deckrear<n){arr[deckrear++]=i;}
		eof=false;
	}
	int popHead(){
		int res=arr[0];
		for(int i=0;i<deckrear;i++) arr[i]=arr[i+1]; 
		if (deckrear>0) {deckrear--;eof=false;} else eof=true;
		return res;
	}
	int popRear(){
		eof=deckrear>1;
		return arr[--deckrear];
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	TDeck *d=new TDeck();
	for(int i=0;i<5;i++) d->push(i*2);
	for(int i=0;i<3;i++){		printf("%d\t",d->popHead());	}
	printf("\n");
	printf("%d\t",d->popRear());printf("\n");
	d->push(33);
	for(;!d->eof;){		printf("%d\t",d->popHead());	}

	getchar();
	delete d;
	return 0;
}
А вот со списками сложнее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2010, 00:34   #4
CHUCKe
 
Регистрация: 07.11.2010
Сообщений: 5
По умолчанию

не понял кода
CHUCKe вне форума Ответить с цитированием
Старый 20.11.2010, 17:23   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не понял кода
что именно неясно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Надо отфильтровать через clientdataset1 apollon476 Помощь студентам 2 04.11.2010 13:10
Контрольная. Сдать надо через три часа. Boginy Фриланс 6 23.02.2010 20:31
(BC 3.1) Список через одномерный массив Lawliet32 Помощь студентам 6 29.11.2009 19:26
CodeGear. Как сделать, что бы dproj по умолчанию открывалось через Delphi, а не через всю студию? TwiX Общие вопросы Delphi 2 10.11.2009 22:24
Ячейка как список (через VBA) maxic Microsoft Office Excel 5 23.01.2009 00:10