#include<stdio.h>
#include<malloc.h>
//构造结构体
typedef struct LinkNode{
int coefficient;
int exponent;
struct LinkNode *next;
}*LinkList, *NodePtr;
//初始化链表
LinkList initLinkList(){
LinkList tempHeader = (LinkList)malloc(sizeof(struct LinkNode));
tempHeader->coefficient = 0;
tempHeader->exponent = 0;
tempHeader->next = NULL;
return tempHeader;
}
//打印链表
void printfList(LinkList paraHeader){
NodePtr p = paraHeader->next;
while(p != NULL){
printf("%d * 10^%d +",p->coefficient,p->exponent);
p = p->next;
}
printf("\r\n");
}
//打印一个节点进行测试
void printfNode(NodePtr paraPtr, char paraChar){
if(paraPtr == NULL){
printf("NULL\r\n");
}
else{
printf("The element of %c is (%d * 10^%d)\r\n",paraChar,paraPtr->coefficient,paraPtr->exponent);
}
}
//增加一个元素在末尾
void appendElement(LinkList paraHeader, int paraCoefficient, int paraExponent){
NodePtr p,q;
//first step Construct a new node(创造一个新节点)
q = (NodePtr)malloc(sizeof(struct LinkNode));
q->coefficient = paraCoefficient;
q->exponent = paraExponent;
q->next = NULL;
//second step 寻找末尾
p = paraHeader;
while(p->next != NULL){
p = p->next;
}
//third step 插入元素;
p->next = q;
}
//多项式加法
void add(NodePtr paraList1, NodePtr paraList2){
NodePtr p,q,r,s;
//step1 Serch to the position
p = paraList1->next;
printfNode(p,'p');
q = paraList2->next;
printfNode(q,'q');
r = paraList1;
printfNode(r,'r');
free(paraList2);
while((p != NULL)&&(q != NULL)){
//链接正确的节点为第一条链
if(p->exponent<q->exponent){
printf("case 1\r\n");
r->next = p;
r = p;
printfNode(r,'r');
p = p->next;
printfNode(p,'p');
}
else if(p->exponent>q->exponent){
printf("case 2\r\n");
r->next = q;
r = q;
printfNode(r,'r');
q = q->next;
printfNode(q,'q');
}
else{
printf("case 3\r\n");
p->coefficient = p->coefficient + q->coefficient;
printf("the coefficient is: %d.\r\n",p->coefficient);
if(p->coefficient == 0){
printf("case 3.1\r\n");
s = p;
p = p->next;
printfNode(p,'p');
free(s);
}
else{
printf("case 3.2\r\n");
r = p;
printfNode(r,'r');
p = p->next;
printfNode(p,'p');
}
s = q;
q = q->next;
//printf("q is pointing to (%d,%d)\r\n",q->coefficient,q->exponent);
free(s);
}
printf("p = %ld, q = %ld\r\n",p,q);
}
printf("End of while.\r\n");
if(p == NULL){
r->next = q;
}
else{
r->next = p;
}
printf("Additon ends.\r\n");
}//of add
//测试1
void additionTest1(){
//初始化第一个多项式
LinkList tempList1 = initLinkList();
appendElement(tempList1,7,0);
appendElement(tempList1,3,1);
appendElement(tempList1,9,8);
appendElement(tempList1,5,17);
printfList(tempList1);
//第二个
LinkList tempList2 = initLinkList();
appendElement(tempList2,8,1);
appendElement(tempList2,22,7);
appendElement(tempList2,-9,8);
printfList(tempList2);
add(tempList1,tempList2);
printf("The result is: ");
printfList(tempList1);
printf("\r\n");
}
void additionTest2(){
//初始化第一个多项式
LinkList tempList1 = initLinkList();
appendElement(tempList1,7,0);
appendElement(tempList1,3,1);
appendElement(tempList1,9,8);
appendElement(tempList1,5,17);
printfList(tempList1);
//第二个
LinkList tempList2 = initLinkList();
appendElement(tempList2,8,1);
appendElement(tempList2,22,7);
appendElement(tempList2,-9,10);
printfList(tempList2);
add(tempList1, tempList2);
printf("The result is: ");
printfList(tempList1);
printf("\r\n");
}
//入口处
int main(){
additionTest1();
additionTest2();
printf("Finish.\r\n");
return 0;
}
运行结果
这一章的代码运行结果是最迷茫的,在不同的电脑下会有不同的情况,我的电脑来说,他的运行时间比较短时,如0.04几秒的时候,它的运行结果会只出现一个测试样例的结果,而不出现另一个测试样例的结果。而我有些舍友的电脑和不同的编译软件又不会有这个问题,而我有个舍友又有这个问题。我搜了很久,找了好几种情况,最后找到的比较可能的一个情况是,运行时间较短,在循环那个位置会出错,会使运行时每一组都为相同的随机数序列,而调试的时候时间是比较久的,都为不同的随机数序列,专业的这些我不懂,我只能理解就是时间太短导致循环出错,所以我就加了个头文件<windows.h>,用里面的Sleep函数,这个就可以加长运行时间,然后运行结果正确。