Member 13515205 Ответов: 2

Я хочу, чтобы хранить несколько значений в динамический массив с помощью функции scanf и я хочу, чтобы отобразить, что динамический массив. Что я делаю не так?


Я хочу сохранить эти числа в динамическом массиве и отобразить их. Что я делаю не так в этом фрагменте кода?

Что я уже пробовал:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void push(int*,int,int*);
void display(int*,int,int*);
void main(){
	int done=0,choice,n,top=-1;
	int stack;
	while(!done){
		printf("1.Push\t2.Pop\t3.display\t4.exit\n");
		printf("enter the choice\n");
		scanf("%d",&choice);
		switch(choice){
			case 1:printf("enter the number of elements you want to insert\n");
			scanf("%d",&n);
			push(&stack,n,&top);
			break;
			case 3:display(&stack,n,&top);break;
			case 4:done=1;break;
			default:printf("wrong value\n");break;

		}
	}
}

void push(int *stack,int n,int *top){
	int i;
	stack=malloc(n*sizeof(stack));
	printf("enter the elements\n");
	for(i=0;i<n;i++){
		scanf("%d\n",(stack+i));
		top++;
	}
}

void display(int *stack,int n,int *top){
	int i;
	if(*top==-1){
		printf("stack is empty\n");
	}
	for(i=0;i<n;i++){
		printf("%d",*(stack+i));
	}
}

2 Ответов

Рейтинг:
1

OriginalGriff

Почти все.
stack это не int: это должен быть указатель на int. Почему? Потому что вы не можете загрузить динамический массив значений в один int!
Почему вы отказываетесь от всего каждый раз, когда пытаетесь "протолкнуть" набор ценностей?

Сделайте себе одолжение, и сломайте отладчик.
Поместите точку останова в первую строку основной функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Рейтинг:
0

CPallini

Я хотел бы использовать struct для maintining: массив значений, размер массива (то есть количество доступных слотов стека) и текущая вершина стека.

typedef struct _Stack
{
  int * value; // the array of values
  int SLOTS; // the number of available slots
  int top; // the current top of the stack
} Stack;


Более того я бы разделил твою push работа в create один и настоящий push один (то есть вставить один пункт).

Попробуйте, например (обратите внимание, что код просто утверждает об условиях ошибки, в зависимости от ваших потребностей, вы можете использовать более сложную обработку ошибок)
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef struct _Stack
{
  int * value;
  int SLOTS;
  int top;
} Stack;


Stack * create(int SLOTS);
void destroy(Stack * stack);
void push (Stack * stack, int i);
int pop (Stack * stack);
void display(Stack * stack);


int main()
{
  int choice = 0;
  Stack * stack = NULL;
  do
  {
    printf("1.Create\n2.Push\n3.Pop\n4.Display\n5.Exit\n");
    printf("Please, enter your choice\n");
    if ( scanf("%d", &choice) == 1)
    {
      switch (choice)
      {
      case 1:
        {
          int SLOTS;
          printf("Please enter the number of slots\n");
          if ( scanf("%d", &SLOTS) == 1)
          {
            stack = create( SLOTS );
          }
        }
        break;
      case 2:
        {
          int i;
          printf("Please enter the value to push\n");
          if ( scanf("%d", &i) == 1)
          {
            push(stack, i);
          }
        }
        break;
      case 3:
        {
          int i = pop(stack);
          printf("Popped value is %d\n", i);
        }
        break;
      case 4:
        printf("Stack content is\n");
        display(stack);
        break;
      case 5:
      default:
        break;
      }
    }
  } while ( choice != 5);

  if ( stack ) destroy( stack );

  return 0;
}

Stack * create( int SLOTS )
{
  assert(SLOTS > 0);
  Stack * stack = (Stack * ) malloc(sizeof(Stack));
  assert(stack);
  stack->value = (int *) malloc(sizeof(int) * SLOTS);
  if ( ! stack->value )
  {
    free(stack);
    assert(0);
  }
  stack->SLOTS = SLOTS;
  stack->top = 0;
  return stack;
}

void push(Stack * stack, int i)
{
  assert( stack && stack->top < stack->SLOTS);
  stack->value[stack->top] = i;
  ++stack->top;
}

int pop(Stack * stack)
{
  assert(stack && stack->top > 0);
  --stack->top;
  return stack->value[stack->top];
}

void destroy( Stack * stack )
{
  assert(stack);
  free(stack->value);
  free(stack);
}

void display(Stack * stack)
{
  assert(stack);
  int n;
  for (n=0; n<stack->top; ++n)
  {
    printf("stack[%d] = %d\n", n, stack->value[n]);
  }
}