02-线性结构2 一元多项式的乘法与加法运算 (20 分)

#include <stdio.h>
#include <stdlib.h>
typedef struct Node *PtrToNode;

struct Node {
    int Data; /* 存储结点数据 */
    int Data2;
	PtrToNode   Next; /* 指向下一个结点的指针 */
};

typedef PtrToNode List; /* 定义单链表类型 */
typedef PtrToNode *ist;

List Add(List L1,List L2);
void Attach(int a,int b,List *Rear) {
	List P;
	P=(List)malloc(sizeof(struct Node));
	P->Data = a;
	P->Data2 = b;
	P->Next=NULL;
	(*Rear)->Next = P;
	*Rear = P;
}
List read(){
	List P,Rear,t;
	int c,e,N;
	scanf("%d",&N);
	P=(List)malloc(sizeof(struct Node))	;
	P->Next=NULL;
	Rear=P;
	while(N){
		scanf("%d %d",&c,&e);
		Attach(c,e,&Rear);
		N=N-1;
	} 
	t=P;P=P->Next;free(t);
	return P;	 
	}

List Add(List L1,List L2) {
	List P,Rear,t1,t2,t;
	t1=L1;t2=L2;
	P =(List)malloc(sizeof(struct Node));
	P->Next=NULL;
	Rear= P;
	while(t1 && t2){
		if(t1->Data2==t2->Data2){
			if(t1->Data + t2->Data == 0) {
				t1 = t1->Next;t2 = t2->Next;
			}else{
			Attach(t1->Data+t2->Data,t1->Data2,&Rear);
			 t1 = t1->Next;t2 = t2->Next;}
		} else if(t1->Data2 > t2->Data2) {
			Attach(t1->Data,t1->Data2,&Rear);t1 = t1->Next;
		} else { Attach(t2->Data,t2->Data2,&Rear);t2 = t2->Next;}
	}
	while(t1){
		Attach(t1->Data,t1->Data2,&Rear);t1 = t1->Next;
	}
	while(t2){
		Attach(t2->Data,t2->Data2,&Rear);t2 = t2->Next;
	}
	return P->Next;
}
void Print(List a){
	int flag=0;
	if(!a){printf("0 0\n");return;}
	while(a){
		if(!flag){
			flag=1;
		}else{
			printf(" ");
		}
			printf("%d %d",a->Data,a->Data2);
		a=a->Next;
	}
	printf("\n");
} 
List Mult(List L1,List L2){
		List P,Rear,t1,t2,t;
		int a,b;
	if(!L1 || !L2){return NULL;	}
		t1=L1;t2=L2;
		P =(List)malloc(sizeof(struct Node));
		P->Next=NULL;
		Rear=P;
		
		while(t2){
			Attach(t1->Data*t2->Data,t1->Data2+t2->Data2,&Rear);
			t2=t2->Next;
		}
		t1=t1->Next;
		//Print(P->Next);
		while(t1){
			t2=L2;Rear=P;
			while(t2){
				Rear=P;
				a=t1->Data*t2->Data;
				b=t2->Data2+t1->Data2;
				while(Rear->Next && Rear->Next->Data2 > b)
				Rear=Rear->Next;
				if (Rear->Next && Rear->Next->Data2 == b){
					if (Rear->Next->Data + a == 0){t=Rear->Next;Rear->Next=t->Next;free(t);}
					else Rear->Next->Data = a + Rear->Next->Data;
				}else {
					t=(List)malloc(sizeof(struct Node));
					t->Data=a;t->Data2=b;
					t->Next=Rear->Next;
					Rear->Next=t;Rear=Rear->Next;
				}t2=t2->Next;	
			}	t1=t1->Next;
		} t=P;P=P->Next;free(t);
	
	return P;	
}
int main(){
	List L1,L2,La,Lm;
	L1=read();
	L2=read();
	La=Add(L1,L2);
	Lm=Mult(L1,L2);
	Print(Lm);
	Print(La);
}

这一个作业做了我非常久,其实主要还是内心的浮躁,在无数次DEbug之后才发现自己一些非常愚蠢的错误,对于写代码我有一些疑问,好像老师也没教,虽然我是看MOOC,也许大学里科班的老师会强调这些吧,在程序不能如愿的时候,似乎找出问题在哪里的能力很差,尤其是像这样的作业,第一次完成比较大型的作业,其实也不算大型,哎,DEbug到想要放弃学习,不过总算挺过来了,按理来说写完应该挺高兴,但是回顾这个过程感觉蛮打击自己的自信心的,也许是C语言不够熟练,确实C我也是入门。如何阅读自己的程序也是非常的重要,不知道有没有相关的书籍。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值