一只特立独行的青蛙 2018-10-03 15:29 采纳率: 50%
浏览 402
已采纳

链式队列的一个问题,为什么第一种可以运行,第二种没有报错但是运行会中断?

第一种:
typedef struct Qnode//队列结点定义
{
int data;
Qnode * next;
}Qnode;

typedef struct Lq//链队类型定义
{
Qnode * front;
Qnode * rear;
}Lq;

bool is_empty(Lq *qu)//判断是否队空
{
if(qu->front==NULL||qu->rear==NULL)
{

  return true;

}
else
return false;
}

void init(Lq * &qu)//初始化
{
qu=(Lq *)malloc(sizeof(Lq));
(*qu).front=(*qu).rear=NULL;
printf("初始化成功!\n");
}

void in_qu(Lq * qu,int a)//入队
{
Qnode s;
s=(Qnode
)malloc(sizeof(Qnode));
s->next=NULL;
s->data=a;

  if(is_empty(qu))
  {
      qu->front=qu->rear=s;

  }
  else
  {
    qu->rear->next=s;
    qu->rear=s;
  }
  return;

}
void out_qu(Lq * qu)//出队
{
Qnode * p;
int a;
if(is_empty(qu))
{
printf("队空不能出队!\n");
return;
}
p=qu->front;
a=qu->front->data;
qu->front=p->next;
if(qu->front==NULL)//即队列中只有一个元素
qu->rear=NULL;
free(p);
printf("出队的元素是:%d\n",a);
return;
}

void out_qu(Lq * qu);
void in_qu(Lq * qu,int a);
bool is_empty(Lq *qu);
void init(Lq * & qu);

int main()
{
Lq qu;
Lq * p;
p=&qu;
init(p);
in_qu(p,1);
out_qu(p);
return 0;

}

第二种:
typedef struct Qnode//队列结点定义
{
int data;
Qnode * next;
}Qnode;

typedef struct Lq//链队类型定义
{
Qnode * front;
Qnode * rear;
}Lq;

bool is_empty(Lq *qu)//判断是否队空
{
if(qu->front==NULL||qu->rear==NULL)
{

  return true;

}
else
return false;
}

void init(Lq * &qu)//初始化
{
qu=(Lq *)malloc(sizeof(Lq));
(*qu).front=(*qu).rear=NULL;
printf("初始化成功!\n");
}

void in_qu(Lq * qu,int a)//入队
{
Qnode s;
s=(Qnode
)malloc(sizeof(Qnode));
s->next=NULL;
s->data=a;

  if(is_empty(qu))
  {
      qu->front=qu->rear=s;

  }
  else
  {
    qu->rear->next=s;
    qu->rear=s;
  }
  return;

}
void out_qu(Lq * qu)//出队
{
Qnode * p;
int a;
if(is_empty(qu))
{
printf("队空不能出队!\n");
return;
}
p=qu->front;
a=qu->front->data;
qu->front=p->next;
if(qu->front==NULL)//即队列中只有一个元素
qu->rear=NULL;
free(p);
printf("出队的元素是:%d\n",a);
return;
}
void out_qu(Lq * qu);
void in_qu(Lq * qu,int a);
bool is_empty(Lq *qu);
void init(Lq * & qu);

int main()
{
Lq qu;
init(&qu);
in_qu(&qu,1);
out_qu(&qu);
return 0;

}

  • 写回答

6条回答 默认 最新

  • threenewbee 2018-10-04 01:44
    关注

    楼主,你要注意了。对于c++来说,除非传递引用(也就是你所谓正确的方式),否则在函数内修改一个变量,永远无法作用到实参上。
    void init(Lq * qu)//初始化
    {
    qu=(Lq *)malloc(sizeof(Lq));
    (*qu).front=(*qu).rear=NULL;
    printf("初始化成功!\n");
    }
    这段代码,你虽然修改了qu,让qu指向你分配的内存。但是退出函数,
    init(&qu);
    这里的qu并不会改变。

    请注意以下两个的区别:
    (1)修改一个指针,让它指向另一个地址,这个不会作用到实际参数
    (2)通过指针,修改其指向的内容。这个会作用到实际参数指向的内容,因为两者共享的是相同的内容。

    因此,如果你要在函数内改变指针指向的内容,那么用指针就可以。要改变指针的指向,让它指向另一个地址,那么必须用指针的指针(2个指针)
    此时对于第二个指针,它指向实际的内容,第一个指针,指向第二个指针,而你可以修改第一个指针的指向,从而将第二个指针指向的内容作用到调用者。

    修改以后的程序:

    #include "stdio.h"
    #include "stdlib.h"
    
    typedef struct Qnode//队列结点定义
    {
    int data;
    Qnode * next;
    }Qnode;
    
    typedef struct Lq//链队类型定义
    {
    Qnode * front;
    Qnode * rear;
    }Lq;
    
    bool is_empty(Lq *qu)//判断是否队空
    {
    if(qu->front==NULL||qu->rear==NULL)
    {
    
      return true;
    }
    else
    return false;
    }
    
    void init(Lq ** qu)//初始化
    {
    *qu=(Lq *)malloc(sizeof(Lq));
    (*qu)->front=(*qu)->rear=NULL;
    printf("初始化成功!\n");
    }
    
    void in_qu(Lq * qu,int a)//入队
    {
    Qnode * s;
    s=(Qnode *)malloc(sizeof(Qnode));
    s->next=NULL;
    s->data=a;
    
      if(is_empty(qu))
      {
          qu->front=qu->rear=s;
    
      }
      else
      {
        qu->rear->next=s;
        qu->rear=s;
      }
      return;
    }
    void out_qu(Lq * qu)//出队
    {
    Qnode * p;
    int a;
    if(is_empty(qu))
    {
    printf("队空不能出队!\n");
    return;
    }
    p=qu->front;
    a=qu->front->data;
    qu->front=p->next;
    if(qu->front==NULL)//即队列中只有一个元素
    qu->rear=NULL;
    free(p);
    printf("出队的元素是:%d\n",a);
    return;
    }
    void out_qu(Lq * qu);
    void in_qu(Lq * qu,int a);
    bool is_empty(Lq *qu);
    void init(Lq * qu);
    
    int main()
    {
    Lq * qu;
    init(&qu);
    in_qu(qu,1);
    out_qu(qu);
    return 0;
    
    }
    
    
    

    注意我对main和init的修改。

    运行:
    图片说明

    当然。程序还有一种改法,(只有c++可以,c不可以)就是用引用。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥15 请帮我解决一下下面六个代码
  • ¥15 关于资源监视工具的e-care有知道的嘛
  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)