user-0 提问: 一个调用函数无法执行

回复:
user: user-1
content: 引用 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;  //... } 类似的例子还可以举很多。 这个是真的，从安全高效方面来说，必须的。

user: user-2
content: 不要使用 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;  //... } 类似的例子还可以举很多。

user: user-0
content: 引用 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;  //... } 类似的例子还可以举很多。 非常感谢，以后我会试着这样思考的。我还是初学者，有很多地方的确容易出错。

user: user-0
content: 引用 8 楼 ysmz555 的回复:这里的  else if(p2 == NULL)              {                 p3->next = p1;                 p1->next = NULL;              }              else              {                 p3->next = p1;                 p1->next = p2;              } 中的p2==NULL是判断到了链表的最后不，到了则插入到最后，否则插入到中间结点。 的却是这样，但是如果是表尾，p2 == NULL。那么执行else里的也可以达到目的啊。效果是一样的吧。这个写出来只是为了方便学习它的人看明白是这样吗？

user: user-1
content: 这里的  else if(p2 == NULL)              {                 p3->next = p1;                 p1->next = NULL;              }              else              {                 p3->next = p1;                 p1->next = p2;              } 中的p2==NULL是判断到了链表的最后不，到了则插入到最后，否则插入到中间结点。

user: user-0
content: else if(p2 == NULL)              {                 p3->next = p1;                 p1->next = NULL;              }              else              {                 p3->next = p1;                 p1->next = p2;              }前面的表后插入和else里的功能貌似没有区别。为什么列出来？给解释下呗？我看网上也是这么写的。

user: user-3
content: 如果准备插入到表尾，第一个 while 循环结束后，p2 就是 NULL 了，但是后面的代码没有处理这种情况

user: user-4
content: 引用 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这句将会出现非法访问

user: user-0
content: 我去。我搁着改了一天了，终于找到问题的所在了。 while (p2 != NULL && p1->NO > p2->NO)这个循环语句， 如果写成while (p1->NO > p2->NO && p2 != NULL)那么每次运行在表位插入时就结束进程，为什么？ while（）循环里面的顺序还有这讲究吗？求大神告知。

user: user-1
content: 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;              }     } }

user: user-0
content: 引用 1 楼 wang0635 的回复:如果准备插入到表尾，第一个 while 循环结束后，p2 就是 NULL 了，但是后面的代码没有处理这种情况 while (p1->NO < p2->NO || p2 == NULL); 这里有个处理的，p2 == NULL跳到else里。

user: user-5
content: 链表、链表、链表…… http://blog.csdn.net/zhangxiangdavaid/article/details/25082013