C/C++利用链表实现一元多项式相加

//预编译区::  
#include "stdafx.h"  
#include  
#define OK 1  
#define ERROR 0  
#define MAXLEN 10  
#define LT -1  
#define EQ 0  
#define GT 1  
using namespace std;  
  
//数据结构声明区::  
typedef struct {  
    float coef;  
    int exp;  
}Term;  
  
typedef struct LNode{  
    Term data;  
    struct LNode *next;  
}LinkList;  
  
typedef int status;  
  
//函数声明区::  
void InitLink(LinkList &L);  
void CreatLink(LinkList &L);  
void InsertLink(LinkList *tail,LinkList *s);  
void DispLink(LinkList L, char ch);  
void SortLink(LinkList &L);  
status Compare(int x, int y);  
//void LocateElem(LinkList L, LinkList *p, LinkList *q);  
void AppendLink(LinkList *p, LinkList *q);  
void AddPoly(LinkList &A, LinkList &B);  
  
//主函数区::  
int main(void)  
{  
    LinkList A, B,C;  
    InitLink(A); CreatLink(A); DispLink(A, 'A');        //创建A  
    InitLink(B); CreatLink(B); DispLink(B, 'B');        //创建B  
    InitLink(C);        //创建C  
    printf("排序过后");  
    SortLink(A); DispLink(A, 'A');      //将A排序  
    printf("排序过后");  
    SortLink(B); DispLink(B, 'B');      //将B排序  
    AddPoly(A, B);  
    printf("一元多项式加和后");  
    DispLink(A, 'A');  
    system("pause");  
    return 0;  
}  
  
//函数定义区::  
//初始化链表  
void InitLink(LinkList &L) {  
    L.data.coef = 0.0;  
    L.data.exp = 0;  
    L.next = NULL;  
    return;  
}  
  
//构造链表  
void CreatLink(LinkList &L) {  
    int i,n;  
    LinkList *temp,*tail=&L;  
    printf("请输入输入元素个数:");  
    scanf_s("%d", &n);  
    printf("请输入元素的系数域和指数域:\n");  
    for (i = 1; i <= n; i++) {  
        temp = (LinkList *)malloc(sizeof(LinkList));        //每次生成一个新结点  
        scanf_s("%f,%d",&(temp->data.coef), &(temp->data.exp));  
        InsertLink(tail,temp);      //将新结点插入到链表尾部  
    }  
    return;  
}  
  
//尾插法插入元素,在上次记录了为指针的位置后面再插入一个元素  
void InsertLink(LinkList *tail,LinkList *s) {  
    s->next=tail->next;       //直接将元素插入尾部   
    tail->next=s;  
    tail = s;  
    return;  
}  
  
//显示输出链表  
void DispLink(LinkList L,char ch){  
    LinkList *p = (&L)->next;  
    printf("链表%c为:",ch);  
    while(p->next!=NULL) {  
        printf("%f*x^%d+",p->data.coef, p->data.exp);  
        p = p->next;  
    }  
    printf("%f*x^%d", p->data.coef, p->data.exp);  
    printf("\n");  
    return;  
}  
  
//将无序的链表排序  
void SortLink(LinkList &L) {  
    LinkList *pre, *p=NULL, *q=NULL;  
    p=(&L)->next->next;       //p指向第二个结点  
    (&L)->next->next = NULL;      //将头结点和首结点单独隔开  
    while (p) {     //当p不为空指针时  
        q = p->next;  
        pre = &L;  
        while (pre->next != NULL&&pre->next->data.exp < p->data.exp)  
        //判断单独隔开的部分与另一部分的第一个值的大小,若小于则指针下移  
        //直至下移到大于它的位置就停止      
            pre = pre->next;  
        p->next = pre->next;      //将另一部分中的第一个值插入到被隔开部分的相应位置  
        pre->next = p;  
        p = q;  
    }  
    return;  
}  
//比较两元素大小  
status Compare(int x,int y) {  
    if (x > y) return GT;  
    else if (x == y) return EQ;  
    else return LT;  
}  
  
//将L中第一个大于p指向值位置的指针返回到q中:  
void LocateElem(LinkList L, LinkList *p, LinkList *q) {  
    q = &L;  
    while (q->next!=NULL) {  
        if (p->data.exp > q->next->data.exp) q++;  
        else break;  
    }  
    return;  
}  
  
//将指针q后的所有元素追加到L中的p之后  
void AppendLink(LinkList *p,LinkList *q){  
    p->next = q;  
    return;  
}  
  
//删除结点  
void DelLink(LinkList &L, LinkList *p) {  
    LinkList *temp=&L;  
    while (temp->next != p){  
        temp=temp->next;  
    }  
    temp->next = p->next;  
    free(p);  
    p = NULL;  
    return;  
}  
  
//一元多项式求和运算(将一元多项式B加到一元多项式A中)::  
void AddPoly(LinkList &A,LinkList &B){  
    float sum;  
    LinkList *pa = (&A)->next, *pb = (&B)->next, *pc = &A;    //pc总指向C的最后一个结点  
    while(pa && pb) {  
        switch (Compare(pa->data.exp, pb->data.exp)) {  
        case 1:  
            pc->next=pb;  
            pc = pb;  
            pb = pb->next;  
            break;  
        case 0:  
            //直接相加两者的系数域内的值,并更新到A中  
            sum = pa->data.coef + pb->data.coef;  
            if (sum) {  
                LinkList *temp = pb;        //记录pb准备释放  
                pa->data.coef = sum;     //更新pa内的值  
                pc->next = pa;  
                pc = pa;        //将pa链接到C中  
                pa = pa->next;  
                pb = pb->next;  
                free(temp);  
            }  
            else {      //当sum为0时直接将pa,pb下移并将两者释放  
                LinkList *s1=pa;  
                LinkList *s2=pb;  
                if(pc!=(&A)&&pa->next!=NULL)     //若果pc=&A并且pa->next=NULL的话,  
                    pc->next = pa->next;          //pc->next就为空,那么输出的时候就会出现访问地址冲突的错误  
                pa = pa->next;  
                pb = pb->next;  
                if (s1 != (&A)->next&&s2 != (&B)->next) {  
                    free(s1); free(s2);     //为了防止空链表时访问地址冲突  
                }  
            }  
            break;  
        case -1:  
            pc->next = pa;  
            pc = pa;  
            pa = pa->next;  
            break;  
        }  
    }  
    if(pc!=(&A)&&pb!=NULL)      //为了防止空链表时&(A)->next置为空  
        pc->next = pa?pa:pb;     //判断pa为不为空,若为空则将pb追加,若不为空则不变  
    return;  
}  


C/C++利用链表实现一元多项式相加_第1张图片

你可能感兴趣的:(C/C++利用链表实现一元多项式相加)