user-0 提问: 求两链表交集.貌似进入死循环..

回复:
user: user-1
content: #include<stdio.h> #include <stdlib.h> #include<malloc.h>  typedef struct Node {     int data;     struct Node *next; }Node,*LinkList;  int CreatList(LinkList *L) {     int i;     Node *p, *last;      *L=(LinkList)malloc(sizeof(Node));     (*L)->data = 0;     (*L)->next = NULL;     last = *L;     while(scanf("%d", &i) && i != -1) {         p = (Node *)malloc(sizeof(Node));         p->data = i;         p->next = NULL;         last->next = p;         last = p;     }     return 0; } void fun(LinkList S1,LinkList S2,LinkList *S3) {     Node *p, *q, *r;     p = S1->next;     q = S2->next;     (*S3) = (LinkList)malloc(sizeof(struct Node));     (*S3)->next = NULL;     r = (*S3);     while(p && q)     {         if(p->data < q->data)             p = p->next;         else if(p->data>q->data)             q = q->next;         else         {             r->next = p;             r = p;             p = p->next;             q = q->next;         }     }     r->next = NULL; } void Print(LinkList L) {     Node *p;     p = L->next;     if(!p)         printf("NULL\n");     else     {         while(p->next)         {             printf("%d ",p->data);             p = p->next;         }         printf("%d\n", p->data);     } } int main() {     LinkList S1,S2,S3;     CreatList(&S1);     Print(S1);     getchar();     CreatList(&S2);     Print(S2);     fun(S1,S2, &S3);     Print(S3);     return 0; }  问题主要是以下几点： 1. while(scanf("%d",&i),i!=-1)，逗号运算符，对于scanf的返回不做判断，只是以i != 1作为while的判断，将逗号运算符改成 && 2. 输出时，if(p=NULL) 改成if (p == NULL)或者if (!p) 3. 以上两点是语法错误，fun是逻辑错误。 下面是我的修改，作为一个参考： #include<stdio.h> #include <stdlib.h> #include<malloc.h>  typedef struct Node {     int data;     struct Node *next; }Node,*LinkList;  int CreatList(LinkList *L) {     int i;     Node *p, *last;      *L=(LinkList)malloc(sizeof(Node));     (*L)->data = 0;     (*L)->next = NULL;     last = *L;     while(scanf("%d", &i) && i != -1) {         p = (Node *)malloc(sizeof(Node));         p->data = i;         p->next = NULL;         last->next = p;         last = p;     }     return 0; } void fun(LinkList S1,LinkList S2,LinkList *S3) {     Node *p, *q, *r;     p = S1->next;     q = S2->next;     (*S3) = (LinkList)malloc(sizeof(struct Node));     (*S3)->next = NULL;     r = (*S3);     while(p && q)     {         if(p->data < q->data)             p = p->next;         else if(p->data>q->data)             q = q->next;         else         {             r->next = p;             r = p;             p = p->next;             q = q->next;         }     }     r->next = NULL; } void Print(LinkList L) {     Node *p;     p = L->next;     if(!p)         printf("NULL\n");     else     {         while(p->next)         {             printf("%d ",p->data);             p = p->next;         }         printf("%d\n", p->data);     } } int main() {     LinkList S1,S2,S3;     CreatList(&S1);     Print(S1);     getchar();     CreatList(&S2);     Print(S2);     fun(S1,S2, &S3);     Print(S3);     return 0; }

user: user-2
content: 在调试模式运行，出错时点中断，通过调用堆栈定位到相关位置观察分析原因

user: user-2
content: if (p = NULL) printf("NULL");  改成：  if (p == NULL) printf("NULL");

user: user-2
content: fun(S1, S2, S3); 这里的S3，还没有初始化，你就使用了

user: user-3
content: 说什么非降序就是升序

user: user-0
content: 引用 2 楼 paschen 的回复:if (p = NULL) printf("NULL");  改成：  if (p == NULL) printf("NULL");  奥这个后来我改了的 这里忘记说了。。S3初始化后也还是会程序停止运行