2 weixin 40182907 weixin_40182907 于 2018.03.01 20:20 提问

预习数据结构用C语言写链队出现的一个小问题,可能关于指针

可以编译,但是没有办法运行
用vs调试,我猜测问题出现在指针初始化上面
(init 函数)

 #include<stdio.h> 
#include<malloc.h>

typedef struct  node
{  struct  node *next;
    int data;
} QNode;

//

typedef struct aaa
{  QNode *front;
   QNode *rear;   //指针指向 QNode 类型 
}LQueue;

// 初始化
void init (QNode *s,LQueue *L)
{   s= (struct  node* )malloc(  sizeof(struct  node));
    L= (LQueue* )malloc(  sizeof(LQueue));
     s->next=NULL;
     L->front=L->rear=(struct  node* )malloc(  sizeof(struct  node)) ;
     L->front=L->rear= s;


 } 
 //入队
 void push (LQueue *l,int x)
{   QNode *q=NULL;
   q= (struct  node* )malloc(  sizeof(struct  node));
     q->data=x;  q->next=NULL;           
   l->rear->next=q;
    l->rear = q;

 }  

 QNode *pop (QNode *p,LQueue *L,int *x)
 {   QNode *s=NULL; 
      s=L->front;
     L->front=L->front->next;
      *x = s->data;
      free(s);
 }

 //测试
 int main(void)
 {  int x=1;int *x1=NULL;
  QNode *a = NULL;
  LQueue *b =NULL;
  init (a,b);
  push( b ,x);
 // printf("%d",L->rear->data);

 }

4个回答

trojanth
trojanth   2018.03.02 09:52
已采纳

void init (QNode **s, LQueue **L)

*s =malloc(....)
*L = .......

参数有问题

leilba
leilba   Rxr 2018.03.01 21:45

这行代码 push(b ,x); b其实是NULL,你使用init初始化的时候并没有将main方法里面的b进行赋值,对指针还是需要更多理解的

lz201_xxj
lz201_xxj 赞,好久没见到你了。
4 个月之前 回复
caozhy
caozhy 赞,好久没见到你了。
4 个月之前 回复
mmxiwen
mmxiwen   2018.03.04 18:03

main里边代码执行完了,a,b的值都还是NULL,init传参应该传a和b的地址,init函数的形参两个都应该用二级指针。
如果不这样,就只是把a, b的值传下去了,也就是NULL传下去了,而不能够改变a和b里边的值,也就是init函数并不能把a和b的值改为节点的地址
下边是改好的代码,我已经验证好了,你可以先验证一下,然后再比较不一样的地方,可以再交流
//
// main.m
// csdn
//
// Created by 李习文 on 2018/3/4.
// Copyright © 2018年 李习文. All rights reserved.
//

#include
#include
//#include

typedef struct node
{ struct node *next;
int data;
} QNode;

//

typedef struct aaa
{ QNode *front;
QNode *rear; //指针指向 QNode 类型
}LQueue;

// 初始化
void init (QNode **s,LQueue **L)
{ s= (struct node )malloc( sizeof(struct node));
L= (LQueue )malloc( sizeof(LQueue));
(*s)->next=NULL;
(*L)->front=(*L)->rear= s;
}
//入队
void push (LQueue **l,int x)
{ QNode *q=NULL;
q= (struct node
)malloc( sizeof(struct node));
q->data=x; q->next=NULL;
(*l)->rear->next=q;
(*l)->rear = q;
}

/*
QNode *pop (QNode *p,LQueue *L,int *x)
{ QNode *s=NULL;
s=L->front;
L->front=L->front->next;
*x = s->data;
return s;
}
*/
//测试
int main(void)
{ int x=1;int *x1=NULL;
QNode *a = NULL;
LQueue *b =NULL;
init (&a,&b);
push(&b ,x);
printf("%d\n",b->rear->data);

}

qq_38646470
qq_38646470   2018.03.05 21:30

入队时情况没分清楚,空队列和非空队列情况不一样,
初始化写的也很不好,只用初始化队列结构就好,链表节点开辟可以抽象为一个函数。
链接里是我写的,你可以看看,有什么问题可以私信,也是我初学的时候写的。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!