gpt4 book ai didi

c - 第一次创建Stack。一行打印两次。为什么?

转载 作者:行者123 更新时间:2023-11-30 16:41:36 25 4
gpt4 key购买 nike

我已经按照您所说更新了之前的代码,但还有最后一个问题。我不知道为什么当我运行代码时有一行不断打印两次。

该行是:

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;
}
}
}
}

最佳答案

在此 typedef 声明中

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

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

作为函数 insert 中此语句的结果

temp->next=s;

尝试将s类型的node指针分配给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;
}

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

并且您必须使用此调用的函数删除的返回值

delete(top);

不正确,因为原始指针top没有改变。

关于c - 第一次创建Stack。一行打印两次。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46205870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com