第一次创建Stack.One行打印两次。为什么?

时间:2017-09-13 19:56:47

标签: c pointers

我已按照您的说法更新了以前的代码,但还有最后一个问题。 我不知道为什么有一行在运行代码时会继续打印两次。

这一行是:

printf("\nEnter values of x:");

代码是:

   #include <stdio.h>
#include<stdlib.h>
typedef struct node{
  int a;
 struct node* next;
}node;

node* create(node* s)
{
  s=NULL;
  printf("\n Empty stack is created\n");
  return s;
}

node* insert(node* s,int x)
{
  if (s==NULL)
  {
  s=malloc(sizeof(node));
  s->a=x;
  s->next=NULL;
  }

  else
  {
    node* temp=malloc(sizeof(node));
    temp->a=x;
    temp->next=s;
    s=temp;
  }
  return s;
}
node* print(node* s)
{
  while(s!=NULL)
  {
    printf("%d",s->a);
    s=s->next;
  }
  return s;
}
node* delete(node* s)
{
  node* s1;
  if(s==NULL)
  {
  printf("trying to delete from empty list");
  }
  else
  {
   s1=s->next;
   printf("element deleted is %d",s->a);
   s->next=NULL;
   free(s);
   }
  return s1;
}
node* delete(node*s);
node* insert(node*s,int x);
node* create(node* s);
node* print(node* s);
int main()
{
node* top;
top=create(top);
char x;
int val;
while(1)
{

  printf("\nEnter values of x:");
  scanf("%c",&x);
  switch(x)
  {
  case 'I':
  {
    printf("\nPlease enter value to be inserted\n");
    scanf("%d",&val);
    top=insert(top,val);
    break;
  }
  case 'D':
  {
    delete(top);
    break;
  }
  case 'P':
  {
    top=print(top);
  }
  case 'E':
  {
      return 0;
  }
}
}
}

1 个答案:

答案 0 :(得分:0)

在此typedef声明中

typedef struct {
  int a;
 struct node* next;
}node;

声明了两种类型。第一个是未命名的结构类型,它获取typedef名称node。第二个是在未命名结构中声明的不完整struct node

结果例如在函数insert

中的此语句中
temp->next=s;

尝试将node类型s的指针分配给struct node类型的temp->next指针,并且没有隐式转换从一个指针到另一个指针。

您应该按以下方式重写typedef

typedef struct node {
  int a;
 struct node* next;
}node;

在这种情况下,名称struct nodenode指的是同一个实体。

注意这个功能

node* create(node* s)
{
  s=NULL;
  printf("\n Empty stack is created");
  return s;
}

没有意义,实际上参数是多余的。你可以写

node* create( void )
{
  printf("\n Empty stack is created");
  return NULL;
}

void create(node **s)
{
  *s = NULL;
  printf("\n Empty stack is created");
}

此功能

node* delete(node* s)
{
  node* s1;
  if(s==NULL)
  {
  printf("trying to delete from empty list");
  }
  else
  {
   s1=s->next;
   printf("element deleted is %d",s->a);
   s->next=NULL;
   free(s);
   }
  return s1;
}

具有未定义的行为,因为当s1等于s时,它会返回未初始化的指针NULL

您必须使用此调用函数delete的返回值

delete(top);

不正确,因为原始指针top未更改。