一、代码实现
1.构建结构体
typedef struct LinkNode{
int coefficient;
int exponent;
struct LinkNode *next;
}*LinkList,*NodePtr;
2.初始化结点
LinkList initLinkList(){
LinkList tempHeader=(LinkList)malloc(sizeof(struct LinkNode));
tempHeader->coefficient=0;
tempHeader->exponent=0;
tempHeader->next=NULL;
return tempHeader;
}
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);
}
}
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;
}
5.改进后的加法函数
void add(Listptr plist1,Listptr plist2){
Nodeptr p,q,r,s,m;
p=plist1->next;q=plist2->next;
s=plist1,m=plist2;
while((p!=NULL)&&(q!=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=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;
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;
}
}
6.插入函数
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);
}
7.定位函数
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;
}
8.测试函数
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");
}
9.完整代码
#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)&&(q!=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();
}