1.定义结构体
//定义一个结构体
typedef struct LinkNode{
int cofficient;//系数
int exponent;//次方
struct LinkNode *next;//指针
}*LinkList,*NodePtr;
2.初始化
//初始化(全为空)
LinkList initList(){
LinkList tempHeader = (LinkList)malloc(sizeof(struct LinkNode));//申请空间
tempHeader -> cofficient = 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->cofficient, p->exponent);
p = p->next;
}
printf("\r\n");
}
4.打印节点
//打印节点
void printNode(NodePtr paraPtr , char paraChar){
if (paraPtr == NULL){
printf("NULL\n");
}
else{
printf("这个元素是:%c (%d * 10^%d)\n" , paraChar , paraPtr->cofficient , paraPtr->exponent);
}
}
5.设计连接函数
//设计连接函数
void appendElement(LinkList paraHeader , int paraCoefficient , int paraExponent){
NodePtr p , q;//定义指针
//申请空间
q = (NodePtr)malloc(sizeof(struct LinkNode));
q->cofficient = paraCoefficient;
q->exponent = paraExponent;
q->next = NULL;
//寻找尾部
p = paraHeader;
while (p->next != NULL){
p = p->next;
}
//链接链表
p->next = q;
}
6.多项式的相加函数
//加法运算函数的设计
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) && (q != NULL)){
if (p->exponent < q->exponent){
printf("case 1\n");//连接当前的节点
r = p;
printNode(r,'r');
p = p->next;
printNode(p,'p');
}
else if((p->exponent > q->exponent)){
printf("case 2\n");//连接当前的链表
r->next = q;
r = q;
printNode(r,'r');
q = q->next;
printNode(q,'q');
}
else{
printf("case 3\n");
//交换当前的链表
p->cofficient = p->cofficient + q->cofficient;
printf("The cofficient is: %d.\n",p->cofficient);
if (p->cofficient == 0){
printf("case 3.1\n");
s =p;
p = p->next;
printNode(p,'p');
}else{
printf("case 3.2\n");
r = p;
printNode(r,'r');
p = p->next;
printNode(p,'p');
}
s = q;
q = q->next;
free(s);//释放s;
}
printf("p = %ld, q = %ld\n",p,q);
}
if (p == NULL){
r->next = p;
}else{
r->next = p;
}
printf("Addition ends.\n");
}
7.测试代码
//测试函数
void additionTest(){
/*初始化第一个多项式*/
LinkList tempList1 = initList();
appendElement(tempList1,7,0);
appendElement(tempList1,3,1);
appendElement(tempList1,9,8);
appendElement(tempList1,5,17);
printList(tempList1);
/*初始化第二个多项式*/
LinkList tempList2 = initList();
appendElement(tempList2,8,1);
appendElement(tempList2,22,7);
appendElement(tempList2,-9,8);
printList(tempList2);
/*添加到第一个进去*/
add(tempList1,tempList2);
printList(tempList1);
}
8.总代码
#include<stdio.h>
#include<malloc.h>
//定义一个结构体
typedef struct LinkNode{
int cofficient;//系数
int exponent;//次方
struct LinkNode *next;//指针
}*LinkList,*NodePtr;
//初始化(全为空)
LinkList initList(){
LinkList tempHeader = (LinkList)malloc(sizeof(struct LinkNode));//申请空间
tempHeader -> cofficient = 0;
tempHeader -> exponent = 0;
tempHeader -> next = NULL;
return tempHeader;
}
//打印链表
void printList(LinkList paraHeader){
NodePtr p = paraHeader->next;
while (p != NULL){
printf("%d * 10^%d +", p->cofficient, p->exponent);
p = p->next;
}
printf("\r\n");
}
//打印节点
void printNode(NodePtr paraPtr , char paraChar){
if (paraPtr == NULL){
printf("NULL\n");
}
else{
printf("这个元素是:%c (%d * 10^%d)\n" , paraChar , paraPtr->cofficient , paraPtr->exponent);
}
}
//设计连接函数
void appendElement(LinkList paraHeader , int paraCoefficient , int paraExponent){
NodePtr p , q;//定义指针
//申请空间
q = (NodePtr)malloc(sizeof(struct LinkNode));
q->cofficient = paraCoefficient;
q->exponent = paraExponent;
q->next = NULL;
//寻找尾部
p = paraHeader;
while (p->next != NULL){
p = p->next;
}
//链接链表
p->next = q;
}
//加法运算函数的设计
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) && (q != NULL)){
if (p->exponent < q->exponent){
printf("case 1\n");//连接当前的节点
r = p;
printNode(r,'r');
p = p->next;
printNode(p,'p');
}
else if((p->exponent > q->exponent)){
printf("case 2\n");//连接当前的链表
r->next = q;
r = q;
printNode(r,'r');
q = q->next;
printNode(q,'q');
}
else{
printf("case 3\n");
//交换当前的链表
p->cofficient = p->cofficient + q->cofficient;
printf("The cofficient is: %d.\n",p->cofficient);
if (p->cofficient == 0){
printf("case 3.1\n");
s =p;
p = p->next;
printNode(p,'p');
}else{
printf("case 3.2\n");
r = p;
printNode(r,'r');
p = p->next;
printNode(p,'p');
}
s = q;
q = q->next;
free(s);//释放s;
}
printf("p = %ld, q = %ld\n",p,q);
}
if (p == NULL){
r->next = p;
}else{
r->next = p;
}
printf("Addition ends.\n");
}
//测试函数
void additionTest(){
/*初始化第一个多项式*/
LinkList tempList1 = initList();
appendElement(tempList1,7,0);
appendElement(tempList1,3,1);
appendElement(tempList1,9,8);
appendElement(tempList1,5,17);
printList(tempList1);
/*初始化第二个多项式*/
LinkList tempList2 = initList();
appendElement(tempList2,8,1);
appendElement(tempList2,22,7);
appendElement(tempList2,-9,8);
printList(tempList2);
/*添加到第一个进去*/
add(tempList1,tempList2);
printList(tempList1);
}
int main(){
additionTest();
printf("Game is over!!!\n");
}
9.运行结果