一只特立独行的青蛙 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 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看