我已按照您的说法更新了以前的代码,但还有最后一个问题。 我不知道为什么有一行在运行代码时会继续打印两次。
这一行是:
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;
}
}
}
}
答案 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 node
和node
指的是同一个实体。
注意这个功能
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
未更改。