一个调用函数无法执行

zhourqaiai 2016-01-22 10:38:53
void inter (struct stu *& head)
{
struct stu * p1, * p2, * p3;
p1 = (struct stu *)malloc(sizeof (struct stu));
printf("enter a NO;\n");
scanf ("%d", &p1->NO);
getchar ();
printf("enter a name:\n");
gets (p1->name);
printf ("enter a sex:\n");
scanf("%c", &p1->sex);
getchar ();
printf ("enter a score:\n");
scanf("%f", &p1->score);
p2 = head;
if (head == NULL)
{
head = p1;
}
while (p1->NO > p2->NO && p2 != NULL)
{
p3 = p2;
p2 = p2->next;
}
while (p1->NO < p2->NO || p2 == NULL)
{
if(p2 == head)
{
p1->next = head;
head = p1;
}
else
{
p1->next = p2;
p3->next = p1;
}
break;
}
}
如上,一个链表插入的主程序无法运行只能插入到表中位置和表头,表位插入老是结束进程。求大神帮忙看下。
...全文
230 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysmz555 2016-01-25
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) { if (条件1) break; //... if (条件2) continue; //... if (条件3) return; //... } 因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。 典型如: 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) { a=fgetc(f); //... b=fgetc(f);//可能此时已经feof了! //... } 而这样写就没有问题: while (1) { a=fgetc(f); if (feof(f)) break; //... b=fgetc(f); if (feof(f)) break; //... } 类似的例子还可以举很多。
这个是真的,从安全高效方面来说,必须的。
赵4老师 2016-01-25
  • 打赏
  • 举报
回复
不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) { if (条件1) break; //... if (条件2) continue; //... if (条件3) return; //... } 因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。 典型如: 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) { a=fgetc(f); //... b=fgetc(f);//可能此时已经feof了! //... } 而这样写就没有问题: while (1) { a=fgetc(f); if (feof(f)) break; //... b=fgetc(f); if (feof(f)) break; //... } 类似的例子还可以举很多。
zhourqaiai 2016-01-25
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) { if (条件1) break; //... if (条件2) continue; //... if (条件3) return; //... } 因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。 典型如: 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) { a=fgetc(f); //... b=fgetc(f);//可能此时已经feof了! //... } 而这样写就没有问题: while (1) { a=fgetc(f); if (feof(f)) break; //... b=fgetc(f); if (feof(f)) break; //... } 类似的例子还可以举很多。
非常感谢,以后我会试着这样思考的。我还是初学者,有很多地方的确容易出错。
zhourqaiai 2016-01-25
  • 打赏
  • 举报
回复
引用 8 楼 ysmz555 的回复:
这里的 else if(p2 == NULL) { p3->next = p1; p1->next = NULL; } else { p3->next = p1; p1->next = p2; } 中的p2==NULL是判断到了链表的最后不,到了则插入到最后,否则插入到中间结点。
的却是这样,但是如果是表尾,p2 == NULL。那么执行else里的也可以达到目的啊。效果是一样的吧。这个写出来只是为了方便学习它的人看明白是这样吗?
ysmz555 2016-01-24
  • 打赏
  • 举报
回复
这里的 else if(p2 == NULL) { p3->next = p1; p1->next = NULL; } else { p3->next = p1; p1->next = p2; } 中的p2==NULL是判断到了链表的最后不,到了则插入到最后,否则插入到中间结点。
zhourqaiai 2016-01-24
  • 打赏
  • 举报
回复
else if(p2 == NULL) { p3->next = p1; p1->next = NULL; } else { p3->next = p1; p1->next = p2; }前面的表后插入和else里的功能貌似没有区别。为什么列出来?给解释下呗?我看网上也是这么写的。
wang0635 2016-01-23
  • 打赏
  • 举报
回复
如果准备插入到表尾,第一个 while 循环结束后,p2 就是 NULL 了,但是后面的代码没有处理这种情况
paschen 2016-01-23
  • 打赏
  • 举报
回复
引用 5 楼 zhourqaiai 的回复:
我去。我搁着改了一天了,终于找到问题的所在了。 while (p2 != NULL && p1->NO > p2->NO)这个循环语句, 如果写成while (p1->NO > p2->NO && p2 != NULL)那么每次运行在表位插入时就结束进程,为什么? while()循环里面的顺序还有这讲究吗?求大神告知。
前者p2 == NULL时,将不会执行p1->NO > p2->NO 而后者,先执行p1->NO > p2->NO,而此时如果p2 == NULL,p2->NO这句将会出现非法访问
zhourqaiai 2016-01-23
  • 打赏
  • 举报
回复
我去。我搁着改了一天了,终于找到问题的所在了。 while (p2 != NULL && p1->NO > p2->NO)这个循环语句, 如果写成while (p1->NO > p2->NO && p2 != NULL)那么每次运行在表位插入时就结束进程,为什么? while()循环里面的顺序还有这讲究吗?求大神告知。
ysmz555 2016-01-23
  • 打赏
  • 举报
回复
void inter (struct stu * head) { struct stu * p1, * p2, * p3; p1 = (struct stu *)malloc(sizeof (struct stu)); printf("enter a NO;\n"); scanf ("%d", &p1->NO); getchar (); printf("enter a name:\n"); gets (p1->name); printf ("enter a sex:\n"); scanf("%c", &p1->sex); getchar (); printf ("enter a score:\n"); scanf("%f", &p1->score); p2 = head; if (head == NULL) { head = p1; p1->next = NULL; } else { while (p2 != NULL && p1->NO > p2->NO) { p3 = p2; p2 = p2->next; } if(p2 == head) { head = p1; p1->next = p2; } else if(p2 == NULL) { p3->next = p1; p1->next = NULL; } else { p3->next = p1; p1->next = p2; } } }
zhourqaiai 2016-01-23
  • 打赏
  • 举报
回复
引用 1 楼 wang0635 的回复:
如果准备插入到表尾,第一个 while 循环结束后,p2 就是 NULL 了,但是后面的代码没有处理这种情况
while (p1->NO < p2->NO || p2 == NULL); 这里有个处理的,p2 == NULL跳到else里。
苏叔叔 2016-01-23
  • 打赏
  • 举报
回复

69,371

社区成员

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

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