Что не так с моим кодом? - PullRequest
0 голосов
/ 05 апреля 2011

В последнее время я делаю свой проект для стекирования, но у меня есть проблема с моим кодом для проталкивания узла:

void push(struct stackNode *Stackptr , int data)
{
     struct stackNode *conductor;

     conductor = malloc(sizeof(struct stackNode));
     if(conductor !=NULL)
     {
                conductor->data=data;
                conductor->nxt=*Stackptr;
                Stackptr = conductor ;
                  }     
     else{
         printf("Wrong insertion"); 
          }

     }

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

#include<stdio.h>
#include<stdlib.h>

struct stackNode
{
       int data;
       struct stackNode *nxt;
       };

struct stackNode *Stack;


void instructions()
{
     printf("        Please Select a Number to do the following\n\n");
     printf("              [1]Push a value\n");
     printf("              [2]Pop a value\n");
     printf("              [2]Peek a node\n");
     printf("              [3]Display\n");
     printf("              [4]Exit\n               ");
     }

     int main ()
     {
         int value; 
         int choice;
         Stack = NULL;

         instructions();

     do
     {
       scanf("%d",&choice);
         system("cls");


         if(choice == 1)
             {
                 printf("Enter your Desired Digit: ");

                                       }

              if(choice == 2)
              {
                        printf(" "); 
                        }       
              if(choice == 3)
              {

                        printf(" ");
                        }
                if(choice == 4 )
                {

                          printf("bye!");
                          return 0;
                          }      



         }while(choice !=4);

         getch();
         }

    void push(struct stackNode *Stackptr , int data)
    {
         struct stackNode *conductor;

         conductor = malloc(sizeof(struct stackNode));
         if(conductor !=NULL)
         {
                    conductor->data=data;
                    conductor->nxt=*Stackptr;
                    Stackptr = conductor ;
                      }     
         else{
             printf("Wrong insertion"); 
              }

         }

Ответы [ 5 ]

2 голосов
/ 05 апреля 2011

В функции push вы назначаете стековый узел, а не указатель на стековый узел.

Вот ошибка:

test.c:76:31: error: incompatible types when assigning to type ‘struct stackNode *’ from type ‘struct stackNode’

Удаление * присваивает указатель, которыйчто вы хотите.

Так что это работает:

conductor->nxt=Stackptr;

Тем не менее, есть другие проблемы с программой.

1 голос
/ 05 апреля 2011

Я собираюсь дать краткий обзор поиска неисправности;Быстрая компиляция, ошибка:

74: error: incompatible types when assigning to type ‘struct stackNode *’ from type ‘struct stackNode’

Верно, теперь я знаю, что нужно взглянуть на строку 74. Вниз на строке 74 есть;

  conductor->nxt=*Stackptr;

Даже без необходимости придумыватьпроблема или даже разбираться с указателями (что вам нужно, но это всего лишь быстрая отладка). Итак, давайте удалим * и изменим его на;

  conductor->nxt=Stackptr;

И это одна проблема отсортирована.В этом коде есть много других.Убедитесь, что вы часто отлаживаете и тестируете, и можете интерпретировать ошибки.Если ничего не помогло, не забудьте написать здесь вопрос с ошибкой.

0 голосов
/ 05 апреля 2011

Будет проще, если вы используете typedef:

typedef struct _stacknode
{
    int data;
    struct _stacknode *nxt;
} StackNode;

StackNode *Stack;

Кроме того, так как кажется, что вы изучаете "C" в процессе, проверьте готовую реализацию стека. Это довольно распространенный пример в книгах по программированию или онлайн-учебниках. Вероятно, есть тонны в github . Изучите это, затем попробуйте свое собственное.

0 голосов
/ 05 апреля 2011

Это:

conductor->nxt=*Stackptr;

выглядит неправильно.Поле nxt должно быть указателем, но вы разыменовываете, поэтому вы пытаетесь заполнить весь узел там.очевидная ошибка времени компиляции, которую я видел.

0 голосов
/ 05 апреля 2011

Поскольку вы изменяете Stackptr в методе push, вам необходимо сделать это изменение видимым для вызывающего абонента push с помощью

  • возврат измененного Stackptr или
  • передавая адрес Stackptr.
...