user-0 提问: 有大神帮忙看看嘛，最后总是输出不了啊

回复:
user: user-1
content: 仅供参考：//链表实现一元多项式的加法减法乘法 #include <stdio.h> #include <stdlib.h> typedef struct node { 	float coef;	  //系数 	int	expn;	  //指数 	struct node	*next; } PolyNode;	   //多项式节点	polynomial node typedef PolyNode* Polynomial; Polynomial createPolynomial() {  //创建多项式 	PolyNode *p, *q, *head = (PolyNode *)malloc(sizeof(PolyNode));	 //头节点 	head->next = NULL; 	float coef; 	int	expn; 	printf("输入该多项式每一项的系数和指数，每项一行，输入0 0结束！\n"); 	while (scanf("%f %d", &coef, &expn) && coef) {   // 默认，按指数递减排列 		if (head->next)	{ 			p =	head; 			while (p->next && expn < p->next->expn) 				p =	p->next; 			if (p->next) { 				if (expn ==	p->next->expn) { //有相同指数的直接把系数加到原多项式 					p->next->coef += coef; 					if (p->next->coef >	-0.000001 && p->next->coef < 0.000001) { //若是相加后系数为0，则舍弃该节点 						q =	p->next; 						p->next	= q->next; 						free(q); 					} 				} else { 					q =	(PolyNode*)malloc(sizeof(PolyNode)); 					q->coef	= coef; 					q->expn	= expn; 					q->next	= p->next; 					p->next	= q; 				} 			} else { 				p->next	= (PolyNode*)malloc(sizeof(PolyNode)); 				p =	p->next; 				p->coef	= coef; 				p->expn	= expn; 				p->next	= NULL; 			} 		} else { 			head->next = (PolyNode*)malloc(sizeof(PolyNode)); 			head->next->coef = coef; 			head->next->expn = expn; 			head->next->next = NULL; 		} 	} 	return head; } Polynomial multiply(Polynomial poly, float coef, int expn) {  //多项式与指定单项式相乘，该单项式为 coefx^expn 	PolyNode *p, *q, *Poly = (PolyNode*)malloc(sizeof(PolyNode)); 	p =	Poly; 	q =	poly->next; 	while (q) { 		p->next	= (PolyNode*)malloc(sizeof(PolyNode)); 		p =	p->next; 		p->coef	= (q->coef*coef); 		p->expn	= (q->expn + expn); 		q =	q->next; 	} 	p->next	= NULL; 	return Poly; } void add(Polynomial	poly1, Polynomial poly2) {	//把 poly2 加到	poly1 上 	PolyNode *p, *q, *r; 	r =	poly1; 	p =	poly1->next;  //指向第一个节点 	q =	poly2->next; 	poly2->next	= NULL; 	while (p &&	q) { 		if (p->expn	> q->expn) { 			r->next	= p; 			p =	p->next; 			r =	r->next; 		} else if (p->expn < q->expn) { 			r->next	= q; 			q =	q->next; 			r =	r->next; 		} else { 			PolyNode *t; 			p->coef	+= q->coef; 			if (!(p->coef >	-0.000001 && p->coef < 0.000001)) //系数不为0 			{ 				r->next	= p; 				r =	r->next; 				p =	p->next; 			} else { 				t =	p; 				p =	p->next; 				free(t); 			} 			t =	q; 			q =	q->next; 			free(t); 		} 	} 	if (p) 		r->next	= p; 	if (q) 		r->next	= q; } Polynomial polySubtract(Polynomial poly1, Polynomial poly2)	{  //多项式减法	poly1-poly2形成一个新的多项式 	//把poly2的系数取相反数，形成一个新的多项式 	Polynomial poly	= (PolyNode*)malloc(sizeof(PolyNode)); //构造头节点 	PolyNode *p, *q; 	p =	poly; 	q =	poly2->next; 	while (q) { 		p->next	= (PolyNode*)malloc(sizeof(PolyNode)); 		p =	p->next; 		p->coef	= -(q->coef);  //系数取反 		p->expn	= q->expn; 		q =	q->next; 	} 	p->next	= NULL; 	add(poly, poly1);  //利用加法 	return poly; } Polynomial polyAdd(Polynomial poly1, Polynomial	poly2) { //多项式相加 poly1+poly2形成一个新的多项式 	Polynomial poly	= (PolyNode*)malloc(sizeof(PolyNode));	//和多项式的头节点 	poly->next = NULL; 	PolyNode *p, *q, *r; 	r =	poly; 	p =	poly1->next; 	q =	poly2->next; 	while (p&&q) { 		if (p->expn	> q->expn) { 			r->next	= (PolyNode*)malloc(sizeof(PolyNode)); 			r =	r->next; 			r->coef	= p->coef; 			r->expn	= p->expn; 			p =	p->next; 		} else if (p->expn < q->expn) { 			r->next	= (PolyNode*)malloc(sizeof(PolyNode)); 			r =	r->next; 			r->coef	= q->coef; 			r->expn	= q->expn; 			q =	q->next; 		} else { 			float m	= p->coef +	q->coef; 			if (!(m	> -0.000001	&& m < 0.000001)) { 				r->next	= (PolyNode*)malloc(sizeof(PolyNode)); 				r =	r->next; 				r->coef	= m; 				r->expn	= p->expn; 			} 			q =	q->next; 			p =	p->next; 		} 	} 	while (p) { 		r->next	= (PolyNode*)malloc(sizeof(PolyNode)); 		r =	r->next; 		r->coef	= p->coef; 		r->expn	= p->expn; 		p =	p->next; 	} 	while (q) { 		r->next	= (PolyNode*)malloc(sizeof(PolyNode)); 		r =	r->next; 		r->coef	= q->coef; 		r->expn	= q->expn; 		q =	q->next; 	} 	r->next	= NULL; 	return poly; } Polynomial polyMultiply(Polynomial poly1, Polynomial poly2)	{  //多项式相乘 	Polynomial poly	= (PolyNode*)malloc(sizeof(PolyNode));	//创建多项式和的头节点 	poly->next = NULL; 	PolyNode *p; 	p =	poly2->next; 	while (p) { 		add(poly, multiply(poly1, p->coef, p->expn)); 		p =	p->next; 	} 	return poly; } void printPoly(Polynomial poly)	{  //打印多项式 	if (poly &&	poly->next)	{ 		PolyNode *p	= poly->next;  //p指向第一个节点 		while (p->next)	{ 			printf("%gx^%d", p->coef, p->expn); 			p =	p->next; 			if (p && (p->coef >	0)) 				printf("+"); 		} 		if (p->expn	== 0) 			printf("%g", p->coef);   //打印常数项 		else 			printf("%gx^%d", p->coef, p->expn); 		printf("\n"); 	} } void freePoly(Polynomial poly) {  //释放内存 	if (poly &&	poly->next)	{ 		PolyNode *p, *q; 		p =	poly; 		while (p) { 			q =	p->next; 			free(p); 			p =	q; 		} 	} 	poly = NULL; } int	main() { 	printf("用链表实现多项式的加减法\n"); 	Polynomial poly1, poly2, poly3; 	printf("创建多项式一\n"); 	poly1 =	createPolynomial(); 	printf("多项式一：\n"); 	printPoly(poly1); 	printf("创建多项式二\n"); 	poly2 =	createPolynomial(); 	printf("多项式二：\n"); 	printPoly(poly2); 	printf("两多项式相加，和为：\n"); 	poly3 =	polyAdd(poly1, poly2); 	printPoly(poly3); 	freePoly(poly3); 	printf("两个多项式相乘，积为：\n"); 	poly3 =	polyMultiply(poly1,	poly2); 	printPoly(poly3); 	freePoly(poly3); 	printf("两多项式相减，差为：\n"); 	poly3 =	polySubtract(poly1,	poly2); 	printPoly(poly3); 	freePoly(poly1); 	freePoly(poly2); 	freePoly(poly3); 	system("pause"); 	return 0; }

user: user-0
content: 引用 1 楼 user-3的回复:这贴的图片，可能很难一下就看出哪里的问题阿。。。 可以请你帮我看看为什么printf（“”%c“”,a[i].data）输出不了吗 #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_SIZE 1024 typedef struct{ char data; int weight; int parent; int lchild; int rchild; }Huffnode,*Hufftree; typedef struct stack{ int top; int elem[MAX_SIZE]; }Stack; void Initstack(Stack *s) { s->top=-1; } void push(Stack *s,int e) { s->top++; s->elem[s->top]=e; } int pop(Stack *s) { return s->elem[s->top--]; } bool isempty(Stack *s) { if(s->top==-1) return true; else return false; } void GetHuffmamCode(Hufftree a,int n) { int i,j,s1,s2,max,c,p; Stack s; char ch; Initstack(&s); printf("输入字符集："); for(i=1;i<=n;i++) { scanf("%c",&a[i].data); scanf("%c",&ch); } printf("输入权值："); for(i=1;i<=n;i++) { scanf("%d",&a[i].weight); scanf("%c",&ch); } int m=2*n-1; for(i=1;i<=n;i++) { a[i].parent=0; a[i].rchild=0; a[i].lchild=0; } for(i=n+1;i<=m;i++) { a[i].data=NULL; a[i].weight=0; a[i].parent=0; a[i].lchild=0; a[i].rchild=0; } for(i=n+1;i<=m;i++) { max=65535; for(j=1;j<=i-1;j++) { if(a[j].parent==0&&a[j].weight<=max) { s1=j; max=a[j].weight; } } a[s1].parent=i; max=65535; for(j=1;j<=i-1;j++) { if(a[j].parent==0&&a[j].weight<=max) { s2=j; max=a[j].weight; } } a[s2].parent=i; a[i].weight=a[s1].weight+a[s2].weight; a[i].lchild=s1; a[i].rchild=s2; } for(i=1;i<=n;i++) { c=i; p=a[i].parent; while(p!=0) { if(a[p].lchild==c) push(&s,0); else push(&s,1); c=p; p=a[p].parent; } printf("%c\n",a[i].data); while(!isempty(&s)) printf("%d",pop(&s)); printf("\n"); } } int main() { Hufftree a; int n; int m; printf("输入字符个数："); scanf("%d",&n); m=2*n-1; a=(Hufftree)malloc(sizeof(Huffnode)*m); GetHuffmamCode(a,n); return 0; }

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<malloc.h>    typedef struct polynode {     int coef;     int exp;     struct polynode *next; }polynode, *polylist;  polylist poly_create(void) {     polynode *rear, *head, *s;      int c, e;      rear = head = (polynode *)malloc(sizeof(polynode));     scanf("%d%d", &c, &e);      while (c) {         s = (polynode*)malloc(sizeof(polynode));         s->coef = c;         s->exp = e;         rear->next = s;         rear = s;         scanf("%d%d", &c, &e);     }     rear->next=NULL;      return(head); }    static void insert_node(polylist phead, polylist new_node) {     polylist pcur, pprev;      pprev = phead;     pcur = phead->next;      while (pcur && pcur->exp != new_node->exp) {         pprev = pcur;         pcur = pcur->next;     }     if (!pcur) {         pprev->next = new_node;         return;     }      pcur->coef += new_node->coef;     free(new_node);     if (pcur->coef == 0) {         pprev->next = pcur->next;         free(pcur);     } }  polylist multyploy(polylist pa, polylist pb) {     polylist pa_node, pb_node, pc_node, pc;     int coef, exp;       pc = (polynode*)malloc(sizeof(polynode));     if (!pc)         return NULL;      pa_node = pa->next;     pb_node = pb->next;      if (!pa_node || !pb_node) {         pc = pa_node ? pa : pb;     }     while (pa_node) {         while (pb_node) {             coef = pa_node->coef * pb_node->coef;             exp = pa_node->exp + pb_node->exp;              pc_node = (polylist)malloc(sizeof(polynode));             if (!pc_node)                 exit(0);             pc_node->coef = coef;             pc_node->exp = exp;             pc_node->next = NULL;              insert_node(pc, pc_node);             pb_node = pb_node->next;         }         pa_node = pa_node->next;         pb_node = pb->next;     }      return pc; }  void free_polylist(polylist phead) {     polylist pdel, pcur;      pcur = phead;      while (pcur) {         pdel = pcur;         pcur = pcur->next;         free(pdel);     } }  static void show_polylist(polylist phead) {     if (!phead)         return;      polylist pcur = phead->next;      while(pcur) {         printf("%d", pcur->coef);         printf("*x^%d", pcur->exp);         if (pcur->next)             printf(" + ");         pcur = pcur->next;     }     printf("\n"); }  int main(void) {     polylist pa, pb, pc;      pa = poly_create();     //show_polylist(pa);     pb = poly_create();     //show_polylist(pb);     pc = multyploy(pa, pb);      show_polylist(pc);      free_polylist(pa);     pa = NULL;     free_polylist(pb);     pb = NULL;     free_polylist(pc);     pc = NULL;      return 0; } 供参考～

user: user-3
content: 不管是从大到小， 还是从小到大， 都可以， 其实要处理coef =0 的情况还是有些麻烦的， 比如 一个多项式， p=0x,  需要化简为 p=0,  还是 p=空  关于你的代码，貌似没有必要对第一次循环做特殊处理， 只用2层while 就可以了把, 伪代码是：  while each 式子 of  A {     while each  式子 of B  {          计算 A[i] * B[j] ,                加入到 C 中     } }  while each 式子 of C {      处理coef ==0  }

user: user-0
content: 引用 6 楼 user-3的回复:[quote=引用 5 楼 qq_51281859 的回复:] 我上面的代码是，分别给pa，pb链表赋值，幂从小到大，当赋值到因子为零时，结束循环，然后以第一个多项式的第一项和第二个多项式的每一项相乘，构造一个新的链表，然后以第一个多项式的第二项和第二个多项式的每一项相乘，查找第一个大于或等于这个幂的在链表中的位置，如果幂相等，则因数相加，相加如果等于零，则释放掉这个空间，如果查找到的大于这个幂，则将其插入，最后输出，可是我这构造的第一项与每一项相乘的新链表，单独的话可以输出，进行下面插入操作以后就不能输出了，不知道问题出现在哪里。  我的代码和你的基本也差不多，唯一的一点时， 在计算时， 没有处理coef==0 的情况， 问题是， 当计算某个项coef为0时， 后面的多项式又可能会出现这个项， 所以建议最后计算完后才处理coef==0 的式子， 另外一点，在生成 c 多项式时， 最好以插入排序的方式， 根据幂的大小， 由高到低排列， 这样多项式打印时，比较符合习惯。 [/quote] 我这个输入时按从小到大输入会比较方便，就是不懂为什么最后输出不了

user: user-3
content: 引用 5 楼 qq_51281859 的回复:我上面的代码是，分别给pa，pb链表赋值，幂从小到大，当赋值到因子为零时，结束循环，然后以第一个多项式的第一项和第二个多项式的每一项相乘，构造一个新的链表，然后以第一个多项式的第二项和第二个多项式的每一项相乘，查找第一个大于或等于这个幂的在链表中的位置，如果幂相等，则因数相加，相加如果等于零，则释放掉这个空间，如果查找到的大于这个幂，则将其插入，最后输出，可是我这构造的第一项与每一项相乘的新链表，单独的话可以输出，进行下面插入操作以后就不能输出了，不知道问题出现在哪里。  我的代码和你的基本也差不多，唯一的一点时， 在计算时， 没有处理coef==0 的情况， 问题是， 当计算某个项coef为0时， 后面的多项式又可能会出现这个项， 所以建议最后计算完后才处理coef==0 的式子， 另外一点，在生成 c 多项式时， 最好以插入排序的方式， 根据幂的大小， 由高到低排列， 这样多项式打印时，比较符合习惯。

user: user-0
content: 引用 4 楼 user-3的回复:试了一下上面的代码， 貌似出现无限循环的情况， 实在有点看不懂上面的代码，  下面改写了一个，还请指正   /**  * 在多项式中查找是否有幂为exp的项，  * 如有，返回指向Polynode指针  * 否则返回NULL  */ Polynode* searchByExp(Polylist p, int exp) { 	Polynode* x = p->next; 	while(x!=NULL) { 		if(x->exp == exp) { 			return x; 		} 		x = x->next; 	} 	return NULL; }  Polylist multyploy2(Polylist pa, Polylist pb) { 	Polynode *t1,*t2, *t3, *rear,*p;  	t1=pa->next; 	t2=pb->next;  	rear=p=(Polynode*)malloc(sizeof(Polynode)); 	p->next = NULL;  	while(t1!=NULL) { 		t2 = pb->next; 		while(t2!=NULL) { 			t3 = searchByExp(p, t1->exp+t2->exp ); 			if(t3==NULL) { 				// 生成新的项加入到p 				t3=(Polynode*)malloc(sizeof(Polynode)); 				t3->coef=t1->coef*t2->coef; 				t3->exp = t1->exp + t2->exp; 				t3->next=NULL; 				rear->next=t3; 				rear=t3; 			} 			else { 				t3->coef += (t1->coef*t2->coef); 			} 			t2=t2->next; 		}  		t1 = t1->next; 	}  	return p; }  我上面的代码是，分别给pa，pb链表赋值，幂从小到大，当赋值到因子为零时，结束循环，然后以第一个多项式的第一项和第二个多项式的每一项相乘，构造一个新的链表，然后以第一个多项式的第二项和第二个多项式的每一项相乘，查找第一个大于或等于这个幂的在链表中的位置，如果幂相等，则因数相加，相加如果等于零，则释放掉这个空间，如果查找到的大于这个幂，则将其插入，最后输出，可是我这构造的第一项与每一项相乘的新链表，单独的话可以输出，进行下面插入操作以后就不能输出了，不知道问题出现在哪里。

user: user-0
content: 引用 8 楼 user-3的回复:不管是从大到小， 还是从小到大， 都可以， 其实要处理coef =0 的情况还是有些麻烦的， 比如 一个多项式， p=0x,  需要化简为 p=0,  还是 p=空  关于你的代码，貌似没有必要对第一次循环做特殊处理， 只用2层while 就可以了把, 伪代码是：  while each 式子 of  A {     while each  式子 of B  {          计算 A[i] * B[j] ,                加入到 C 中     } }  while each 式子 of C {      处理coef ==0  } 已经解决了，我又重新写了一个

user: user-0
content: 引用 8 楼 user-3的回复:不管是从大到小， 还是从小到大， 都可以， 其实要处理coef =0 的情况还是有些麻烦的， 比如 一个多项式， p=0x,  需要化简为 p=0,  还是 p=空  关于你的代码，貌似没有必要对第一次循环做特殊处理， 只用2层while 就可以了把, 伪代码是：  while each 式子 of  A {     while each  式子 of B  {          计算 A[i] * B[j] ,                加入到 C 中     } }  while each 式子 of C {      处理coef ==0  } 我把中间相乘的函数改了一下，改成先把相乘结果各项存入链表，然后再同类项相加，可是还是无法输出，如果知道为什么无法输出，问题就解决了 Polylist multyploy(Polylist pa, Polylist pb) { 	Polynode *t1,*t2,*t3,*t,*rear,*p,*r; 	int c, e; 	t1=pa->next; 	p=(Polynode*)malloc(sizeof(Polynode)); 	rear=p; 	while(t1) 	{ 		t2=pb->next; 		while(t2) 		{ 			t=(Polynode*)malloc(sizeof(Polynode)); 			t->coef=t1->coef*t2->coef; 			t->exp=t1->exp+t2->exp; 			t->next=NULL; 			rear->next=t; 			rear=t; 			t2=t2->next; 		} 		t1=t1->next; 	} 	r=p->next; 	while(r->next) 	{ 		t3=r->next; 		while(t3&&t3->exp!=r->exp) 			t3=t3->next; 		if(t3==NULL) 			continue; 		else 		{ 			r->coef=r->coef+t3->coef; 			t=t3->next; 			t3->next=t->next; 			free(t); 		} 		r=r->next; 	} 	 	return (p); }

user: user-3
content: 试了一下上面的代码， 貌似出现无限循环的情况， 实在有点看不懂上面的代码，  下面改写了一个，还请指正   /**  * 在多项式中查找是否有幂为exp的项，  * 如有，返回指向Polynode指针  * 否则返回NULL  */ Polynode* searchByExp(Polylist p, int exp) { 	Polynode* x = p->next; 	while(x!=NULL) { 		if(x->exp == exp) { 			return x; 		} 		x = x->next; 	} 	return NULL; }  Polylist multyploy2(Polylist pa, Polylist pb) { 	Polynode *t1,*t2, *t3, *rear,*p;  	t1=pa->next; 	t2=pb->next;  	rear=p=(Polynode*)malloc(sizeof(Polynode)); 	p->next = NULL;  	while(t1!=NULL) { 		t2 = pb->next; 		while(t2!=NULL) { 			t3 = searchByExp(p, t1->exp+t2->exp ); 			if(t3==NULL) { 				// 生成新的项加入到p 				t3=(Polynode*)malloc(sizeof(Polynode)); 				t3->coef=t1->coef*t2->coef; 				t3->exp = t1->exp + t2->exp; 				t3->next=NULL; 				rear->next=t3; 				rear=t3; 			} 			else { 				t3->coef += (t1->coef*t2->coef); 			} 			t2=t2->next; 		}  		t1 = t1->next; 	}  	return p; }

user: user-0
content: 引用 1 楼 user-3的回复:这贴的图片，可能很难一下就看出哪里的问题阿。。。 大佬想要啥样的，我实在找不出来问题在哪了

user: user-0
content: 引用 1 楼 user-3的回复:这贴的图片，可能很难一下就看出哪里的问题阿。。。 #include<stdio.h> #include<stdlib.h> #include<malloc.h> #define NULL 0 typedef struct Polynode { 	int coef;  //因子 	int exp;   //幂 	struct Polynode *next; }Polynode , * Polylist;  Polylist polycreate( )  { 	Polynode *rear, *head, *s; 	 	int c, e; 	 	rear=head=(Polynode *)malloc(sizeof(Polynode));   	scanf("%d%d",&c,&e);  	while(c!=0)  	{ 	 		s=(Polynode*)malloc(sizeof(Polynode)); 		s->coef=c;  		s->exp=e;  		rear->next=s;  		rear=s;   		scanf("%d%d",&c,&e);  	} 	rear->next=NULL;  	return(head); } Polylist multyploy(Polylist pa, Polylist pb) { 	Polynode *t1,*t2,*t3,*t,*rear,*p; 	int c, e; 	t1=pa->next; 	t2=pb->next; 	rear=p=(Polynode*)malloc(sizeof(Polynode)); 	while(t2) 	{ 		t3=(Polynode*)malloc(sizeof(Polynode)); 		t3->coef=t1->coef*t2->coef; 		t3->exp=t1->exp+t2->exp; 		t3->next=NULL; 		rear->next=t3; 		rear=t3; 		t2=t2->next; 	} 	t1=t1->next; 	while(t1) 	{ 		t2=pb->next; 		rear=p; 		while(t2) 		{ 			e=t1->exp+t2->exp; 			c=t1->coef*t2->coef; 			while(rear->next&&rear->next->exp<e) 				rear=rear->next; 			if(rear->next&&rear->next->exp==e) 			{ 				if(rear->next->coef+c) 					rear->next->coef+=c; 				else 				{ 					t=rear->next; 					rear->next=t->next; 					free(t); 					 				} 			} 			else 			{ 				t=(Polynode*)malloc(sizeof(Polynode)); 				t->coef=c; 				t->exp=e; 				t->next=rear->next; 				rear->next=t; 				rear=rear->next; 			} 		} 		t1=t1->next; 	} 	return (p); } void print(Polylist p) { 	p = p->next; 	while(p) 	{ 		printf("%d", p->coef); 		printf("*x^%d",p->exp); 		if(p->next!=NULL) 			printf(" + "); 		p = p->next; 	} 	printf("\n"); }  void main(int argc, char* argv[]) { 	Polylist pa, pb,pc;   //定义三个表示多项式的链表 	 	pa = polycreate();  //创建pa链表 	pb = polycreate();  //创建pb链表 	pc = multyploy(pa, pb);   //做乘法法，结果保存在pc链表上 	print(pc);      //将加法的结果用一个多项式格式显示在输出设备上 }

user: user-3
content: 这贴的图片，可能很难一下就看出哪里的问题阿。。。