C语言数据结构学习(5):多项式相加

一、代码实现

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();
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,可以使用数据结构来设计和实现多项式相加的功能。一种常见的方法是使用链表来表示多项式。 首先,我们可以定义一个结构体来表示多项式的每一项,包括系数和指数: ```c typedef struct Node { int coefficient; // 系数 int exponent; // 指数 struct Node* next; // 指向下一项的指针 } Node; ``` 然后,我们可以定义一个链表来存储多项式,链表的每个节点表示一个多项式的项: ```c typedef struct Polynomial { Node* head; // 多项式的头节点 } Polynomial; ``` 接下来,我们可以实现一些操作函数来进行多项式的相加。首先,我们需要实现一个函数来创建一个空的多项式: ```c Polynomial* createPolynomial() { Polynomial* poly = (Polynomial*)malloc(sizeof(Polynomial)); poly->head = NULL; return poly; } ``` 然后,我们可以实现一个函数来向多项式中添加一项: ```c void addTerm(Polynomial* poly, int coefficient, int exponent) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->coefficient = coefficient; newNode->exponent = exponent; newNode->next = NULL; if (poly->head == NULL) { poly->head = newNode; } else { Node* current = poly->head; while (current->next != NULL) { current = current->next; } current->next = newNode; } } ``` 接下来,我们可以实现一个函数来将两个多项式相加,并返回结果多项式: ```c Polynomial* addPolynomials(Polynomial* poly1, Polynomial* poly2) { Polynomial* result = createPolynomial(); Node* current1 = poly1->head; Node* current2 = poly2->head; while (current1 != NULL && current2 != NULL) { if (current1->exponent > current2->exponent) { addTerm(result, current1->coefficient, current1->exponent); current1 = current1->next; } else if (current1->exponent < current2->exponent) { addTerm(result, current2->coefficient, current2->exponent); current2 = current2->next; } else { int sum = current1->coefficient + current2->coefficient; if (sum != 0) { addTerm(result, sum, current1->exponent); } current1 = current1->next; current2 = current2->next; } } while (current1 != NULL) { addTerm(result, current1->coefficient, current1->exponent); current1 = current1->next; } while (current2 != NULL) { addTerm(result, current2->coefficient, current2->exponent); current2 = current2->next; } return result; } ``` 以上就是用C语言程序设计数据结构设计多项式相加的基本思路和实现方法。你可以根据需要进行进一步的优化和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值