一个C程序里的一句语句的问题?!

lbq199204 2012-11-06 08:29:38

# include <stdio.h>
# include <malloc.h>
# define NULL 0

typedef struct node

{
int data;
struct node *next;
}LinkList;

print(LinkList *h)
{
LinkList *p;
for (p=h; p; p=p->next)
printf("%4d", p->data);
}

LinkList *creatlist()
{
LinkList *head, *r, *s;
int x;

head = (LinkList*) malloc (sizeof(LinkList));
r = head;
printf("input integer 0 end\n");
scanf("%d", &x);

while(x != 0)
{
s = (LinkList *) malloc (sizeof(LinkList));
s->data = x;
s->next = NULL;
r->next = s;
r = s;
scanf("%d", &x);
}

r->next = NULL;
s = head;
head = head->next;
free(s);
print(head);
return head;
}

void subs()
{
LinkList *p, *p1, *p2, *q, *heada, *headb;
heada = creatlist();
headb = creatlist();
p = heada;
p1 = p;

while(p != NULL)
{
q = headb;

while(q !=NULL && q->data != p->data)
q = q->next;

if(q !=NULL)
{
if(p == heada)
{
heada = heada->next;
p = p1 = heada;
}
else if(p->next == NULL)
{
p1->next = NULL;
p = p->next;
}
else
{
p1->next = p->next;
p2 = p->next;
free(p);
p = p2;
}
}
else
{
p1 = p;
p = p->next;
}
}

p = heada;

if(p == NULL)
printf("result is null\n");
else
printf("result is:\n");

while(p != NULL)
{
printf("%4d", p->data);
p = p->next;
}
}

void main()
{
subs();
}


while(q !=NULL && q->data != p->data)
这句 如果换成while(q->data != p->data && q != NULL) 的话,那运行就不成功了,
为什么会这样的。

这样的的编写顺序有什么原理么?



另外请linux的高手去看下我另外一个贴的问题,linux我是初次接触的,很多东西不懂!能去帮我解决一下那个问题么
http://bbs.csdn.net/topics/390271728?page=1#post-392838191

...全文
180 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbq199204 2012-11-07
  • 打赏
  • 举报
回复
好了,先结了这个贴!谢谢你们了。
wumn29 2012-11-07
  • 打赏
  • 举报
回复
引用 1 楼 givemekey 的回复:
肯定的啊,如果写成 while(q->data != p->data && q != NULL) ,如果q是NULL,那么q->data就爆掉了啥
+1
lbq199204 2012-11-06
  • 打赏
  • 举报
回复
引用 2 楼 armsword 的回复:
&& 先判断前面的,如果不成立,直接结束。如果成立,在判断后面的。
楼上的回答的点上了,你没有哦!不过还是要谢谢你。
lbq199204 2012-11-06
  • 打赏
  • 举报
回复
引用 1 楼 givemekey 的回复:
肯定的啊,如果写成 while(q->data != p->data && q != NULL) ,如果q是NULL,那么q->data就爆掉了啥
对哦,那时候就是所谓了越界了吧!可以称为内存越界是不?
armsword 2012-11-06
  • 打赏
  • 举报
回复
&& 先判断前面的,如果不成立,直接结束。如果成立,在判断后面的。
  • 打赏
  • 举报
回复
肯定的啊,如果写成 while(q->data != p->data && q != NULL) ,如果q是NULL,那么q->data就爆掉了啥

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧