дек на основе динамического массива

  • Автор темы A
  • Дата начала
#1
Написал программу, правда вся реализация в функции main(). Все работает. Хочу перенести теперь все в отдельные функции. У меня получается в функции работа с двойным указателем, а с ними у меня сложновато. Вобщем, когда добавляю элементы, например в начало, последний добавленный элемент выводится нормально, а вместо остальных элементов ерунда. Посмотрите пожалуйста что не так. Пишу в среде BC31

Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <malloc.h>
#include <string.h>
#define N 10

void AddToDeck(int **mas, int *kol, int value, int f)
{
if (f==1)	 //добавление в начало
{
printf("\n Enter value to add in deck: ");
scanf("%d",&value);
if ((*kol)==0)
{
*mas=(int *)malloc( (*kol)*(sizeof(int)) );
*(mas[0])=value;
(*kol)++;
}
else
{
int *temp,i=0;
temp=(int *) malloc( (*kol)*(sizeof(int)) );
while(i<(*kol))
{
temp[i]=*(mas[i]);
i++;
}
free(mas);
++(*kol);
*mas=(int *)malloc( (*kol)*(sizeof(int)) );
i=1;
while(i<(*kol))
{
*(mas[i])=temp[i-1];
i++;
}
free(temp);
*(mas[0])=value;
}
}

if (f==2)  //добавление в конец
{
printf("\n Enter value to add in deck: ");
scanf("%d",&value);
if ((*kol)==0)
{
*mas=(int *)malloc( (*kol)*(sizeof(int)) );
*(mas[0])=value;
(*kol)++;
}
else
{
int *temp,i=0;
temp=(int *)malloc( (*kol)*(sizeof(int)) );
while(i<(*kol))
{
temp[i]=*(mas[i]);
i++;
}
free(mas);
++(*kol);
*mas=(int *)malloc( (*kol)*(sizeof(int)) );
i=0;
while(i<(*kol)-1)
{
*(mas[i])=temp[i];
i++;
}
free(temp);
*(mas[((*kol)-1)])=value;
}
}
}

/*void PrintDeck(int *mas, int kol)
{
int i=0;
while(i<kol)
{
printf(" %d ", mas[i]);
i++;
}
} */

int main()
{ clrscr();
int *mas, kol, choose, value;//, *startptr, *endptr, *endptr;
kol=0;//start=0;//=end=0;

for(;;)
{
printf("\n1.Dobavlenie elemena\n2.Delete n\n3.Vivod deck\n4.Exit\n:");
scanf("%d",&choose);
switch(choose)
{
case 1:
{
clrscr();
int f;
printf("\n 1.Dobavlenie elemena v nachalo\n 2.Dobavlenie elemena v konec\n:");
scanf("%d",&f);
AddToDeck(&mas,&kol,value,f);
printf("\n kol = %d",kol);
break;
}
case 2:
{
clrscr();
int f;
if (kol==0)
{
printf("\n Deck is empty!");
}
else
{
printf("\n 1.Delete elemen iz nachala\n 2.Delete elemen iz konca\n:");
scanf("%d",&f);

if (f==1)
{
int *temp,i=1;
temp=(int *)malloc( (kol-1)*(sizeof(int)) );
while(i<(kol))
{
temp[i-1]=mas[i];
i++;
}
free(mas);
--(kol);
mas=(int *)malloc( (kol)*(sizeof(int)) );
//mas=(int *)realloc( mas,(kol)*(sizeof(int)) );
i=0;
while(i<(kol))
{
mas[i]=temp[i];
i++;
}
free(temp);

}


if (f==2)
{
int *temp,i=0;
temp=(int *)malloc( (kol-1)*(sizeof(int)) );
while(i<(kol-1))
{
temp[i]=mas[i];
i++;
}
free(mas);
--(kol);
mas=(int *)malloc( (kol)*(sizeof(int)) );
//mas=(int *)realloc( mas,(kol)*(sizeof(int)) );
i=0;
while(i<(kol))
{
mas[i]=temp[i];
i++;
}
free(temp);
}
}
break;
}
case 3:
{
if (kol==0)
{
printf("\n Deck is empty!");
}
else
{
int i=0;
while(i<kol)
{
printf(" %d ", mas[i]);
i++;
}
}

//vivod_stack(mas,n,start);
break;
}
case 4:return 0;
}
}

}
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
Охохох.....Код плохо то как читается...
У тебя первоначальный подход немного не верный....
Принцип понимаешь не плохо, но вот с реализацией немного видно подзапутался....
Начнем с того, что избавимся от "указателя на указатель", не нужны они нам впринципи, мы же с памятью на прямую работаем, зачем же нам еще больше "углубляться в бездну".
Щас попробую рассписать твой код...
 

DarkKnight

Well-known member
01.08.2010
653
0
#3
C++:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <malloc.h>
#include <string.h>
#define N 10

//void AddToDeck(int **mas, int *kol, int value, int f)
/*
Испрользовать в этом случае указатель на указатель не нужно, обойдемся просто указателем
для удобство будем использовать не указатель на Koл, а ссылку на него, так будет проще по коду 
и он будет читать намного приятнее
*/
//И value - Лишнее так как ты получаешь его в функции
//Теперь о том, что функция будет возвращать, мы будем работать с динамическим массивом, и память мы под него
//будем выделять из нее же, поэтому мы вернем уже новую выделенную память, вернее указатель на ее начало
int* AddToDeck(int* mas, int& kol, int f) //
{
int value; 
if (f==1)	 //добавление в начало
{
printf("\n Enter value to add in deck: ");
scanf("%d",&value);
if ((kol)==0) /*Уберем от сюда *, т.к. используем ссылку, так же во всех других местах*/
{		 
mas=(int*) malloc( (kol+1) *(sizeof(int)));//Выделим память под массив, тут ты упустил, что kol у тебя = 0, память ты не выделяешь никакую
//тоесть malloc(0), поэтому заменил на Kol+1
mas[0] = value; //Запишим наше значение									 
kol++; //Увеличим счетчик кол-во элементов
}
else
{
int *temp,i=0; //Тут все нормально, но i - можно упустить и использовать место while for(в котором и будешь определять i)
temp=(int *) malloc( (kol+1)*(sizeof(int)) ); //Выделим память опять же на 1 больше кол-ва текущего
while(i<kol) //Тут пока <kol -все верно, но опять же симпатиШнее будет с for
{
temp[i+1]=mas[i]; //Запишим в temp
i++; 
}
free(mas); //Освободим..
kol++; //Увеличим счетчик
/*Тут уже пошло все лишнее*, на уже выгодно работать не с mass а с уже определенным temp */
//mas=(int *)malloc( kol*(sizeof(int)) );
//i=1;
//while(i<kol)
//{
//mas[i]=temp[i-1];
//i++;
//}
//free(temp); Этого тоже не будем делать
mas = temp; //Ну или вот так
mas[0]=value;
}
}

/* НУ ТУТ ВСЕ ПО АНАЛОГИИ */
if (f==2)  //добавление в конец 
{
/*ВОТ ЭТОТ БЛОК ВЫНЕСИ ЗА УСЛОВИЕ ОН У ТЕБЯ ОДИНАКОВ*/
printf("\n Enter value to add in deck: ");
scanf("%d",&value);
if (kol == 0)
{
mas=(int*)malloc( (kol+1)*(sizeof(int)) );
mas[0]=value;
kol++;
}
/*Что бы был 1 раз только*/
/*-----------------------------------------------*/
else
{
int *temp,i=0;
temp=(int *)malloc( (kol+1)*(sizeof(int)) );
while(i<kol)
{
temp[i]=mas[i];
i++;
}
free(mas);
kol++;
//mas=(int *)malloc( kol*(sizeof(int)) );
//i=0;
//while(i<kol-1)
//{
//mas[i]=temp[i];
//i++;
//}
//free(temp);
mas = temp;
mas[kol-1]=value;
}
}
return mas; //Вернем указатель на новый массив 
}

/*void PrintDeck(int *mas, int kol)
{
int i=0;
while(i<kol)
{
printf(" %d ", mas[i]);
i++;
}
} */

int main()
{ 
system("cls");;
int *mas = NULL, kol, choose, value;//, *startptr, *endptr, *endptr;
kol=0;//start=0;//=end=0;

for(;;)
{
printf("\n1.Dobavlenie elemena\n2.Delete n\n3.Vivod deck\n4.Exit\n:");
scanf("%d",&choose);
switch(choose)
{
case 1:
{
system("cls");
int f;
printf("\n 1.Dobavlenie elemena v nachalo\n 2.Dobavlenie elemena v konec\n:");
scanf("%d",&f);
//AddToDeck(mas,kol,value,f); //value - тут не нужно
mas=AddToDeck(mas,kol,f);
printf("\n kol = %d",kol);
printf("%d",mas[0]);
break;
}
case 2:
{
system("cls");
int f;
if (kol==0)
{
printf("\n Deck is empty!");
}
else
{
printf("\n 1.Delete elemen iz nachala\n 2.Delete elemen iz konca\n:");
scanf("%d",&f);

if (f==1)
{
int *temp,i=1;
temp=(int *)malloc( (kol-1)*(sizeof(int)) );
while(i<(kol))
{
temp[i-1]=mas[i];
i++;
}
free(mas);
--(kol);
mas=(int *)malloc( (kol)*(sizeof(int)) );
//mas=(int *)realloc( mas,(kol)*(sizeof(int)) );
i=0;
while(i<(kol))
{
mas[i]=temp[i];
i++;
}
free(temp);
}

if (f==2)
{
int *temp,i=0;
temp=(int *)malloc( (kol-1)*(sizeof(int)) );
while(i<(kol-1))
{
temp[i]=mas[i];
i++;
}
free(mas);
--(kol);
mas=(int *)malloc( (kol)*(sizeof(int)) );
//mas=(int *)realloc( mas,(kol)*(sizeof(int)) );
i=0;
while(i<(kol))
{
mas[i]=temp[i];
i++;
}
free(temp);
}
}
break;
}
case 3:
{
if (kol==0)
{
printf("\n Deck is empty!");
}
else
{
int i=0;
while(i<kol)
{
printf(" %d ", mas[i]);
i++;
}
}

//vivod_stack(mas,n,start);
break;
}
case 4:return 0;
}
}
}
Добавлено: Немного оптимизируй, много лишнего в алгоритме....