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

Тема в разделе "Общие вопросы по С и С++", создана пользователем A, 28 окт 2010.

  1. A

    A Гость

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

    Код (Text):
    #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;
    }
    }

    }
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Охохох.....Код плохо то как читается...
    У тебя первоначальный подход немного не верный....
    Принцип понимаешь не плохо, но вот с реализацией немного видно подзапутался....
    Начнем с того, что избавимся от "указателя на указатель", не нужны они нам впринципи, мы же с памятью на прямую работаем, зачем же нам еще больше "углубляться в бездну".
    Щас попробую рассписать твой код...
     
  3. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (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;
    }
    }
    }
    Добавлено: Немного оптимизируй, много лишнего в алгоритме....
     
  4. A

    A Гость

    Спасибо большое DarkKnight125!
     
Загрузка...

Поделиться этой страницей