user-0 提问: c语言问题-分解单链表

回复:
user: user-1
content: 也就是说a=a->next;语句必须在insert()函数之前，仔细分析insert()函数， 你传入的第二个参数p,在insert函数中修改了p的next指针， 在resolve函数中，如果a=a->next放在里面，也就是insert()函数前面，就会被你在insert()中修改，返回时就找不到原来的链表，所以会陷入死循环。  http://www.onestraw.net

user: user-2
content: 嗯嗯，谢谢，我昨天也想明白了，你这样做效率更高（是不是？我学了时间复杂度，从这个角度来讲还想没有提高，从别的方面呢）

user: user-3
content: 引用 楼主 xd2ss 的回复:新手求助课堂作业 已知由具有头结点的单链表表示的线性表中，含有三类字符的数据元素（字母、数字和其他字符），试编写算法构造三个以循环链表表示的线性表，使每个表中只含有同一类的字符，且利用原表中的结点空间，头结点可另辟空间。  我写的代码如下：  #include<stdio.h> #include<malloc.h> typedef char datatype; typedef struct node {     datatype data;     struct node *next; } linklist; void create(linklist*&); void resolve(linklist*,linklist*,linklist*,linklist*); void insert(linklist*,linklist*); void print1(linklist*); void print2(linklist*); int main() {     linklist *head,*letter,*digit,*other;     create(head);     print1(head);     letter=(linklist*)malloc(sizeof(linklist));//建立3个空循环链表     letter->next=letter;     digit=(linklist*)malloc(sizeof(linklist));     digit->next=digit;     other=(linklist*)malloc(sizeof(linklist));     other->next=other;     resolve(head,letter,digit,other);//调用分解单链表的函数     print2(letter);//输出循环链表     print2(digit);     print2(other); }  //建立单链表 void create(linklist*&head) {     datatype x;     linklist *s,*r;     head=new linklist;     r=head;     while((x=getchar())!='\n')     {         s=(linklist*)malloc(sizeof(linklist));         s->data=x;         r->next=s;         r=s;     }     r->next=NULL; }  //在循环链表中插入 void insert(linklist*h,linklist*p) {     linklist *q=h;     while(q->next!=h) q=q->next;     q->next=p;     p->next=h; }  //输出单链表 void print1(linklist*head) {     linklist *p=head->next;     while(p!=NULL)     {         printf("%c",p->data);         p=p->next;     }     printf("\n"); }  //输出循环链表 void print2(linklist*head) {     linklist *p=head->next;     while(p!=head)     {         printf("%c",p->data);         p=p->next;     }     printf("\n"); }  //添加按字母、数字、其它字符分解单链表算法 void resolve(linklist*head,linklist*letter,linklist*digit,linklist*other) {     linklist *a,*temp;     a=head->next;     while(a!=NULL)     {         if(a->data>=65&&a->data<=90||a->data>=97&&a->data<=122)         {             temp=a;             a=a->next;              //*这句话不能放到选择外面             insert(letter,temp);         }         else if(a->data>=48&&a->data<=57)         {             temp=a;             a=a->next;             insert(digit,temp);         }         else         {             temp=a;             a=a->next;             insert(other,temp);         }         //a=a->next;     } }   Question： 最后一个resolve函数里面的'a=a->next'这句为什么不能放到选择外面？放到外面后进入Insert函数后就陷入了死循环，不断重复insert(other,temp)。 可以的 这样做  //添加按字母、数字、其它字符分解单链表算法 void resolve(linklist*head,linklist*letter,linklist*digit,linklist*other) {     linklist *a,*temp;     a=head->next;     linklist * insLst;     while(a!=NULL)     {         if(a->data>=65&&a->data<=90||a->data>=97&&a->data<=122)         {    insLst = letter; }         else if(a->data>=48&&a->data<=57)         {    insLst =digit;  }         else   { insLst = other;}         temp = a;         a = a->next;              //*这句话能放到选择外面         insert( insLst,temp);    //因为这句话，所以你的做法，不能放到外面     } }