user-0 提问: 链表操作

回复:
user: user-1
content: 先保证逻辑正确，再写代码 合并同类项 struct Polynomial {  int coef;    //系数  int expn;    //指数  struct Polynomial* next;  };   bool MergeNode( Polynomial *a, Polynomial *b) {       assert(a && b);        //if(!a ||!b)return false;                if(a->expn == b->expn){//指数相等，需要合并            a->coef += b->coef;   //合并同类项的数学意义，系数相加。            return true;      //返回true，表示执行了合并运算       }       return false;    //返回false，表示没有，也不需要，合并。 }  Polynomial * MergeList( Polynomial *a) {            assert(a );       if(!a)return NULL;                Polynomial *p=a,*q,*r;//当前节点p 初始化为a，前向指针r，要合并的节点指针q;       do{       r = p;  //从下各节点开始，依次合并到本节点，前指针就是置为当前节点。       while(q = r->next ){ //下个节点是合并对象。            if(MergeNode( p,q)){     //需要合并，合并之并，删除被合并的节点                r ->next = q->next;  //取下节点                free(q);             //释放内存                  }else {                  //不需要合并，不合并，向下走                   r = r->next;         //没合并，到下个节点，看看             };                    }while(p = p->next);              return a;  }

user: user-2
content: 引用 5 楼 edwardvsnc 的回复:[quote=引用 4 楼 huiguimoyu 的回复:] [quote=引用 2 楼 edwardvsnc 的回复:]            while(p->expn == q->expn && q)     如果 q为NULL，你的程序会Crash    改成这样好点while(q && p->expn == q->expn)这有区别吗？[/quote]  q && q->expn  如果q为NULL， q->expn 就不会执行。 不过我忘了这个是不是标准里的了。[/quote] 是。 逻辑短路

user: user-3
content: 单步调试

user: user-4

user: user-5
content: 引用 4 楼 huiguimoyu 的回复:[quote=引用 2 楼 edwardvsnc 的回复:]            while(p->expn == q->expn && q)     如果 q为NULL，你的程序会Crash    改成这样好点while(q && p->expn == q->expn)这有区别吗？[/quote]  q && q->expn  如果q为NULL， q->expn 就不会执行。 不过我忘了这个是不是标准里的了。

user: user-0
content: 引用 2 楼 edwardvsnc 的回复:while(p->expn == q->expn && q)     如果 q为NULL，你的程序会Crash    改成这样好点while(q && p->expn == q->expn)这有区别吗？

user: user-0
content: 引用 1 楼 user-6 的回复:自动停止 还是异常退出，跟踪看看异常退出啊！我贴出渣代码，请帮我看看，谢谢！这个程序的功能是实现多项式的相加减，链表存储结构。#include<stdio.h> #include<stdlib.h> struct Polynomial { int coef;	//系数 int expn;	//指数 struct Polynomial* next; }; #define LEN sizeof(struct Polynomial) int n=0;  /////////////////////////////////////////////////// //函数声明： struct Polynomial * Creat();					//建立一个多项式 void Print(struct Polynomial *head);			//打印出多项式 struct Polynomial * AddPolyn(struct Polynomial *la,struct Polynomial *lb,struct Polynomial *lc);//合并操作 void Add(struct Polynomial * la,char way);		//系数计算操作 void Delete(struct Polynomial * la );			//化简操作 /////////////////////////////////////////////////// void main() { 	struct Polynomial *la,*lb,*lc; 	la = Creat();  	Print(la);  	lb = Creat();  	lc = AddPolyn(la,lb,lc);  	Add(lc,'+'); 	Print(lc); 	Delete(lc); 	Print(lc);  } //////////////////////////////////////////////// struct Polynomial * Creat()					//建立一个多项式 { 	struct Polynomial *head; 	struct Polynomial *p1,*p2; 	int length;  	printf("请输入总项数n="); 	scanf("%d",&length); 	if(length>0) 	{ 		p1=p2=(struct Polynomial *)malloc(LEN);  		printf("请输入第1项的系数，以及第1项的未知数的指数："); 		scanf("%d %d",&p1->coef,&p1->expn); 		head=NULL; 		while(p1->coef!=0) 		{ 			n=n+1; 			if(n==1)head=p1; 			else p2->next=p1; 			p2=p1; 			p1=(struct Polynomial *)malloc(LEN); 			printf("请输入第%d项的系数，以及第%d项的未知数的指数：",n+1,n+1); 			scanf("%d %d",&p1->coef,&p1->expn); 		} 		p2->next=NULL; 		printf("该多项式创建完毕！\n"); 		n=0; 		return(head); 	} 	else  	{ 		printf("项数输入错误！该多项式不存在！"); 		exit(1); 	}	 } struct Polynomial * AddPolyn(struct Polynomial *la,struct Polynomial *lb,struct Polynomial *lc)	//完成多项式的相加,指数相同的计算，不同的插入。按大小次序加 { 	//如果遇到指数相同的，就相加，如果走完都没有，就合并 	struct Polynomial *pa,*pb,*pc; 	pa=la; 	pb=lb; 	if (pa != NULL && pb != NULL && pa->expn <= pb->expn) 	{         lc = pa;         pc = pa;         pa = pa -> next;     } 	else if (pa != NULL && pb != NULL) 	{         lc = pb;         pc = pb;         pb = pb -> next;     }	 	while(pa && pb) 	{ 		if(pa->expn <= pb->expn) 		{ 			pc->next=pa; 			pc=pa; 			pa=pa->next; 		} 		else 		{ 			pc->next = pb; 			pc=pb; 			pb=pb->next; 		} 	} 	pc -> next = pb == NULL ? pa : pb;     pc = lc; 	printf("合并后如下：\n");     return pc; } void Print(struct Polynomial *head)					//打印出多项式 {  	printf("该多项式如下："); 	struct Polynomial *p; 	p=head; 	if(head!=NULL) 	{ 		while(p!=NULL) 		{ 			if(p->coef<0) 			{ 				printf(" -%dx^%d",p->coef,p->expn); 			} 			else printf(" +%dx^%d",p->coef,p->expn);  			p=p->next; 		} 	} 	else printf("链表为空！");   } void Add(struct Polynomial * la,char way) { 	int m = 1; 	int flag = 0; 	struct Polynomial *p,*p2; 	p=la; 	while(p->next!=NULL) 	{ 		  		p2=p->next; 		while(p2->expn == p->expn && !flag) 		{ 			flag = 0; 			switch(way) 			{ 			case '+':p->coef = p->coef + p2->coef;break; 			case '-':p->coef = p->coef - p2->coef;break; 			default:printf("请输入 + 或 - 号！");exit(1);break; 			} 		  			if(p2->next) 			p2=p2->next; 			else flag =1; //			Delete(la,m+1);			//这个位置为什么不行呢？在外面测试都可以			 		} 						//这个位置为什么不行呢？  		p=p->next; //		Delete(la,m+1);//可以 		m++; 	} 	printf("计算结果如下：\n");		  } void Delete(struct Polynomial * la ) { 	struct Polynomial *p,*q; 	p=la; 	if(la) 	{ 		/*  		do 		{ 			q=p->next;	  	 		do 			{ 				if(p->expn == q->expn) 				{	 					p->next = q->next; 					free(q); 					q=p->next; 				} 			}while(q && q->next!=NULL); 			p=p->next;			  		}while(p && p->next!=NULL);*/ 		do 		{ 			q=p->next; 			while(p->expn == q->expn && q) 			{ 				p->next =q->next; 				free(q); 				q=p->next; 			} 			p=p->next; 		}while(p->next); 		printf("\nxx");				  	} 	else exit(1);   }

user: user-5
content: while(p->expn == q->expn && q)     如果 q为NULL，你的程序会Crash    改成这样好点while(q && p->expn == q->expn)

user: user-6
content: 自动停止 还是异常退出，跟踪看看