user-0 提问: 关于单词的排序问题（想用链表实现）

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  #define LEN 20  struct part {     char str[LEN+1];     struct part *next; };  struct part *first = NULL;//首节点  void add_list(void); void print(void); int read_line(char str[],int n);  int main(void) {     int i;     int num;     scanf("%d", &num);     getchar();     for (i = 0; i < num; i++)     {         add_list();     }      print();     return 0; }  void add_list(void) {     int rline;//     struct part *pnew,*prev,*cur;     pnew = (struct part *)malloc(sizeof(struct part));     if (!pnew) {         printf("No Room Exist!\n");         return;     }     pnew->next = NULL;      printf("Enter word: ");     rline = read_line(pnew->str, LEN);     if (rline == 0) {         print();         return;     }     if (!first) {         first = pnew;         return;     }     for (prev = cur = first; cur != NULL; prev = cur, cur = cur->next)         if (strcmp(pnew->str, cur->str)  < 0)             break;      if (prev == cur) {         pnew->next = prev;         first = pnew;     } else {         pnew->next = cur;         prev->next = pnew;     }      return;     /*     for(prev = NULL,cur = first;             cur != NULL && (strcmp(&(p->str),&(cur->str))>0);             prev = cur,cur = cur -> next)         break;     if (cur != NULL && strcmp(&(p->str),&(cur->str))<=0)     {         p->next = cur;         return;     }     if (prev == NULL)     {         first = p;     }     else     {         prev->next = p;     }     */ }  void print(void) {     struct part *pa;      for (pa = first; pa != NULL; pa=pa->next)         printf("%s ",pa->str);     putchar(10); }  int read_line(char str[], int n)//读取字符串 {     int ch,i = 0;      while ((ch = getchar())!= '\n')     {         if (i < n)             str[i++] = ch;         else    /*直接退出，防止空循环*/             break;     }     str[i] = '\0';      return i; } 处理逻辑还是有点问题，尤其是链表判断插入部分，参考一下吧；

user: user-3
content: 调试跟踪是必备技能，网络搜索，学一下，自己使用的编译器，调试器。

user: user-4
content: int main(void) {     for (;;)     {         add_list();     }      return 0; } add_list();中的return 并不能作用于main函数，所以for中是个死循环。。。

user: user-5
content: 你的main函数里是个死循环，add_list又没有直接退出程序，想退出只能杀进程？

user: user-0
content: 谢谢各位。我已经解决了。 下面我会附上我自己的代码。 四楼的代码我测试过，也没有问题，基本上也类似。 总之，谢谢大家了！  #include <stdio.h> #include <stdlib.h> #include <string.h>  #define LEN 20  struct part {     char str[LEN+1];     struct part *next; };  struct part *first = NULL;//首节点  int add_list(void); void print(void); int read_line(char str[],int n);  int main(void) {     for (;;)     {         if(add_list())             break;     } }  int add_list(void) {     int rline;     struct part *p, *prev, *cur;      p = malloc(sizeof(struct part));     if (p == NULL)     {         printf("No Room Exist!\n");         return 0;     }      printf("Enter word: ");     rline = read_line(p->str,LEN);//如果只输入一个'\n',则结束读取，输出结果，结束程序。     if (rline == 0)     {         print();         return 1;     }       for(prev = NULL,cur = first;             cur != NULL && (strcmp((p->str),(cur->str))>0);//比较字符串，如果当前输入的字符串大，则跳向下一个。             prev = cur,cur = cur -> next)         ;      if(prev == NULL)     {         p->next = first;         first = p;     }      //需要插入元素的位置在其他位置     else     {         prev->next = p;         p->next = cur;     }      return 0; }  void print(void) {     struct part *pa;      printf("In sorted order:");     for (pa = first; pa != NULL; pa=pa->next)//输出结果     {         printf("%s ",pa->str);     }     printf("\n"); }  int read_line(char str[],int n)//读取字符串 {     int ch,i = 0;      while ((ch = getchar())!= '\n')     {         if (i < n)         {             str[i++] = ch;         }     }      str[i] = '\0';     return i; }