#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我也是入门。如何阅读自己的程序也是非常的重要,不知道有没有相关的书籍。