1.老师的代码
1.1结构体
typedef struct LinkNode{
int coefficient;
int exponent;
struct LinkNode *next;
}*LinkList,*NodePtr;
1.2初始化
LinkList initLinkList(){
LinkList tempHeader=(LinkList)malloc(sizeof(struct LinkNode));
tempHeader->coefficient=0;
tempHeader->exponent=0;
tempHeader->next=NULL;
return tempHeader;
}
1.3打印链表或结点
void printList(LinkList paraHeader){
NodePtr p=paraHeader->next;
while(p!=NULL){
printf("%d * 10^%d +",p->coefficient,p->exponent);
p=p->next;
}
printf("\r\n");
}
void printNode(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);
}
}
1.4添加元素(尾部依次添加)
void appendElement(LinkList paraHeader,int paraCoefficient,int paraExponent){
NodePtr p,q;
q=(NodePtr)malloc(sizeof(struct LinkNode));
q->coefficient=paraCoefficient;
q->exponent=paraExponent;
q->next=NULL;
p=paraHeader;
while(p->next!=NULL){
p=p->next;
}
p->next=q;
}
1.5加法函数(运行时出现问题)
void add(NodePtr paraList1,NodePtr paraList2){
NodePtr p,q,r,s;
p=paraList1->next;
printNode(p,'p');
q=paraList2->next;
printNode(q,'q');
r=paraList1;
printNode(r,'r');
free(paraList2);
while((p!=NULL)NULL)){
if(p->exponent < q->exponent){
printf("Case 1\r\n");
r=p;
printNode(r,'r');
p=p->next;
printNode(p,'p');
} else if(p->exponent > q->exponent){
printf("Case 2\r\n");
r->next=q;
r=q;
printNode(r,'r');
q=q->next;
printNode(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;
printNode(p,'p');
free(s);
} else{
printf("Case 3.2\r\n");
r=p;
printNode(r,'r');
p=p->next;
printNode(p,'p');
}// if small
s=q;
q=q->next;
free(s);
}// if big
printf("p=%ld,q=%ld\r\n",p,q);
}// while
printf("End of while.\r\n");
if(p==NULL){
r->next=q;
} else {
r->next=p;
}
printf("Addition ends.\r\n");
}
1.5.1不改变测试案例
1.5.2改变测试案例
将多项式2中-9改成9时,出现了壮观的一幕
程序进入了死循环,不停刷屏。
1.6测试函数
void additionTest(){
LinkList tempList1=initLinkList();
appendElement(tempList1,7,0);
appendElement(tempList1,3,1);
appendElement(tempList1,9,8);
appendElement(tempList1,5,17);
printList(tempList1);
LinkList tempList2=initLinkList();
appendElement(tempList2,8,1);
appendElement(tempList2,22,7);
appendElement(tempList2,-9,8);
printList(tempList2);
add(tempList1,tempList2);
printList(tempList1);
}
2.自己的代码
2.1 add函数,此处按照自己的思路写
void add(Listptr plist1,Listptr plist2){
Nodeptr p,q,r,s,m; /*添加,s为p的前驱,m为删除辅助指针*/
p=plist1->next;q=plist2->next;
s=plist1,m=plist2;
/*当p,q皆不指向空时进入while循环*/
while((p!=NULL)NULL)){
/*第一种情况,p指向的指数小于q指向的指数时,p指向下一个结点*/
if(p->exponent < q->exponent){
printf("Case 1\n");
s=s->next; /*前驱同时后移*/
p=p->next;
}
/*第二种情况,p指向的指数大于q指向的指数,将q指向的结点插入链表1中*/
else if(p->exponent > q->exponent){
printf("Case 2\n");
r=(Nodeptr)malloc(sizeof(struct Linknode));
r->coefficient=q->coefficient;
r->exponent=q->exponent;
r->next=p;
s->next=r; //s 为前驱
s=r; /*前驱后移,此时p不用后移,p在此后还有可能遇到指数相同的项*/
m=q;
q=q->next; /*q后移,释放已计算的p结点*/
free(m);
}
/*第三种情况,p,q指向的指数相等*/
else{
printf("Case 3\n");
p->coefficient=p->coefficient + q->coefficient;
/*运算后系数为0,删除链表1中p指向的结点*/
if(p->coefficient==0){
printf("Case 3.1 相等\n");
/*s 为前驱,此时s不用移动,p结点删除后,s仍为前驱,此处仅改变s的next指向*/
s->next=p->next;
m=p;p=p->next; /*释放已计算p结点*/
free(m);
}
/*运算后系数不为0,p后移*/
else{
printf("Case 3.2 不相等\n");
s=s->next; /*前驱和p同时后移*/
p=p->next;
}
m=q; /*释放已计算q结点*/
q=q->next;
free(m);
}
}
/*p指向空时,将q表连接到p表;
q指向空时,则说明已经过以上操作计算完,无需再做处理*/
if(p==NULL){
s->next=q;
}
}
例:
第一步:s指向Header1,p,q指向第一个结点
第二步:前两个结点都为情况1(p的指数小于q),所以循环到情况2(p的指数大于q)
第三步:将q指向的结点插入链表1,s后移,p不动,之后为情况3中第二种
第四步:相加后保留p指向的结点,释放q指向的结点;s,p,q均往后移动,之后为情况三中第一种
第五步:删除p指向的结点,s不动,p后移,q后移
第六步:将q指向的结点加入链表1,s后移(图中未画出),q指向NULL,结束
2.2 GET函数,基本和单链表一致
void get(Listptr pHeader,int pPosition){
//判断输入是否合法
if(pPosition<0){
printf("ERROR! 请输入一个大于零的数!\n");
//return '\0';
} //attention
//通过循环定位p
Nodeptr p=pHeader;
int i;
for(i=0;i<pPosition;++i){
p=p->next;
//若超过链表长度,输出原因并退出
if(p==NULL){
printf("ERROR! 超过限度!\n");
//return'\0';
}
}
//一切正常,输出该节点的值
printf("%d is (%d * 10^%d)\n",pPosition,p->coefficient,p->exponent);
}
结果为输出结点值。
2.3 LOCATE函数,也基本和单链表一致
Nodeptr locate(Listptr pHeader,int pcoefficient,int pexponent){
Nodeptr p=pHeader;
//通过循环定位p
while((p->next!=NULL)&&(p->next->coefficient!=pcoefficient)&&(p->next->exponent!=pexponent)){
p=p->next;
}
//若未找到,输出原因,退出程序
p=p->next;
if(p==NULL){
printf("ERROR! 未找到!\n");
return 0;
}
//一切正常,返回p
return p;
}
结果为返回P指针。
2.4 test函数
void Test(){
/*第一组数据测试,涵盖所有情况*/
Listptr t=init();Listptr tt=init();
printf("TEST 1 初始化 :\n");
printlist(t);printlist(tt);
printf("TEST 1 :\n");
append(t,5,0);
append(t,12,1);
append(t,3,7);
append(t,4,10);
append(t,8,15);
printlist(t);
/*中间穿插的GET测试*/
printf("GET TEST :\n");
get(t,2);
/*中间穿插的LOCATE测试*/
printf("LOCATE TEST :\n");
Nodeptr l=locate(t,4,10);
printf("LOCATE is %ld\n",l);
printf("TEST 1 链表 2 :\n");
append(tt,4,3);
append(tt,4,7);
append(tt,-4,10);
append(tt,2,12);
printlist(tt);
printf("TEST 1 ADD BEGIN :\n");
add(t,tt);
printlist(t);
/*第二组数据测试,常规情况*/
Listptr g=init();Listptr gg=init();
printf("TEST 2 初始化 : \n");
printlist(g);printlist(gg);
printf("TEST 2 :\n");
append(g,2,3);
append(g,4,5);
append(g,3,10);
append(g,2,12);
printlist(g);
printf("TEST 2 链表 2 :\n");
append(gg,4,3);
append(gg,-2,5);
append(gg,5,10);
append(gg,-1,12);
append(gg,5,14);
printlist(gg);
printf("TEST 2 ADD BEGIN :\n");
add(g,gg);
printlist(g);
/*第三组数据测试,为空*/
printf("TEST 3 NULL :\n");
Listptr e=init();Listptr ee=init();
printf("TEST 3 ADD BEGIN :\n");
add(e,ee);
printlist(e);
/*第四组数据测试,刚好相抵消*/
printf("TEST 4 FULL :\n");
Listptr s=init();Listptr ss=init();
append(s,3,1);
append(s,-5,3);
printlist(s);
printf("TEST 4 链表 2 :\n");
append(ss,-3,1);
append(ss,5,3);
printlist(ss);
printf("TEST 4 ADD BEGIN :\n");
add(s,ss);
printlist(s);
printf("END\n");
}
2.5完整代码及运行结果
#include <stdio.h>
#include <malloc.h>
typedef struct Linknode{
int coefficient;
int exponent;
struct Linknode *next;
}*Listptr,*Nodeptr;
Listptr init(){
Listptr tHeader=(Listptr)malloc(sizeof(struct Linknode));
tHeader->coefficient=0;
tHeader->exponent=0;
tHeader->next=NULL;
return tHeader;
}
void printlist(Listptr pHeader){
Nodeptr p=pHeader->next;
while(p!=NULL){
printf("%d * 10^%d +",p->coefficient,p->exponent);
p=p->next;
}
printf("\r\n");
}
void printnode(Nodeptr p,char pChar){
if(p==NULL){
printf("%c is NULL\n",pChar);
}
else{
printf("%c is (%d * 10^%d)\n",pChar,p->coefficient,p->exponent);
}
}
void append(Listptr pHeader,int pcoefficient,int pexponent){
Nodeptr p,q;
q=(Nodeptr)malloc(sizeof(struct Linknode));
q->coefficient=pcoefficient;
q->exponent=pexponent;
q->next=NULL;
p=pHeader;
while(p->next!=NULL)
p=p->next;
p->next=q;
}
void add(Listptr plist1,Listptr plist2){
Nodeptr p,q,r,s,m;//r添加,s为p的前驱,m为删除辅助指针
p=plist1->next;q=plist2->next;
s=plist1,m=plist2;
while((p!=NULL)NULL)){
if(p->exponent < q->exponent){
printf("Case 1\n");
s=s->next;
p=p->next;
}
else if(p->exponent > q->exponent){
printf("Case 2\n");
r=(Nodeptr)malloc(sizeof(struct Linknode));
r->coefficient=q->coefficient;
r->exponent=q->exponent;
r->next=p;
s->next=r;//s 为前驱
s=r;
m=q;
q=q->next;
free(m);
}
else{
printf("Case 3\n");
p->coefficient=p->coefficient + q->coefficient;
if(p->coefficient==0){
printf("Case 3.1 相等\n");
s->next=p->next;//s 为前驱
m=p;p=p->next;
free(m);
}
else{
printf("Case 3.2 不相等\n");
s=s->next;
p=p->next;
}
m=q;
q=q->next;
free(m);
}
}
if(p==NULL){
s->next=q;
}
}
void get(Listptr pHeader,int pPosition){
if(pPosition<0){
printf("ERROR! 请输入一个大于零的数!\n");
//return '\0';
} //attention
Nodeptr p=pHeader;
int i;
for(i=0;i<pPosition;++i){
p=p->next;
if(p==NULL){
printf("ERROR! 超过限度!\n");
//return'\0';
}
}
printf("%d is (%d * 10^%d)\n",pPosition,p->coefficient,p->exponent);
}
Nodeptr locate(Listptr pHeader,int pcoefficient,int pexponent){
Nodeptr p=pHeader;
while((p->next!=NULL)&&(p->next->coefficient!=pcoefficient)&&(p->next->exponent!=pexponent)){
p=p->next;
}
p=p->next;
if(p==NULL){
printf("ERROR! 未找到!\n");
return 0;
}
return p;
}
void Test(){
Listptr t=init();Listptr tt=init();
printf("TEST 1 初始化 :\n");
printlist(t);printlist(tt);
printf("TEST 1 :\n");
append(t,5,0);
append(t,12,1);
append(t,3,7);
append(t,4,10);
append(t,8,15);
printlist(t);
printf("GET TEST :\n");
get(t,2);
printf("LOCATE TEST :\n");
Nodeptr l=locate(t,4,10);
printf("LOCATE is %ld\n",l);
printf("TEST 1 链表 2 :\n");
append(tt,4,3);
append(tt,4,7);
append(tt,-4,10);
append(tt,2,12);
printlist(tt);
printf("TEST 1 ADD BEGIN :\n");
add(t,tt);
printlist(t);
Listptr g=init();Listptr gg=init();
printf("TEST 2 初始化 : \n");
printlist(g);printlist(gg);
printf("TEST 2 :\n");
append(g,2,3);
append(g,4,5);
append(g,3,10);
append(g,2,12);
printlist(g);
printf("TEST 2 链表 2 :\n");
append(gg,4,3);
append(gg,-2,5);
append(gg,5,10);
append(gg,-1,12);
append(gg,5,14);
printlist(gg);
printf("TEST 2 ADD BEGIN :\n");
add(g,gg);
printlist(g);
printf("TEST 3 NULL :\n");
Listptr e=init();Listptr ee=init();
printf("TEST 3 ADD BEGIN :\n");
add(e,ee);
printlist(e);
printf("TEST 4 FULL :\n");
Listptr s=init();Listptr ss=init();
append(s,3,1);
append(s,-5,3);
printlist(s);
printf("TEST 4 链表 2 :\n");
append(ss,-3,1);
append(ss,5,3);
printlist(ss);
printf("TEST 4 ADD BEGIN :\n");
add(s,ss);
printlist(s);
printf("END\n");
}
void main(){
Test();
}
运行结果如图