单链表实现多项式相加~求指教,该怎么处理

单链表实现多项式相加~求指教
#include<stdio.h>
#include<malloc.h>
#include<process.h> // exit()
#define ERROR 0
#define OVERFLOW -2


typedef struct LNode{
  float coef; // 系数 
  int expn; // 指数 
  struct LNode *next;
}*LinkList;


void InitList(LinkList &L)
{ // 操作结果:构造一个空的线性表L
  L=(LinkList)malloc(sizeof(LNode)); // 产生头结点,并使L指向此头结点
  if(!L) // 存储分配失败
  exit(OVERFLOW);
  L->next=NULL; // 指针域为空
}


typedef LinkList Polyn;

void CreatePolyn(Polyn &P,int m){
//InitList(P);
LinkList s=P,L;
P->coef=0.0; P->expn=-1;
for(int i=1;i<=m;i++){
L=(LinkList)malloc(sizeof(LNode)); // 生成新结点
scanf("%f,%d",&L->coef,&L->expn);
s->next=L;
s=s->next;
}
s->next=NULL;
}

int compare(Polyn p1,Polyn p2){
if(p1->expn < p2->expn)
return -1;
else
return (p1->expn > p2->expn?
1:0);
}

void ListDelete(LinkList &L,int i) // 算法2.10。不改变L
 { // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
  int j=0;
  LinkList p=L,q;
  while(p->next&&j<i-1) // 寻找第i个结点,并令p指向其前趋
  {
  p=p->next;
  j++;
  }
  if(!p->next||j>i-1) // 删除位置不合理
  exit(ERROR);
  q=p->next; // 删除并释放结点
  p->next=q->next;
  free(q);
}

 void ListTraverse(LinkList L)
 // vi的形参类型为ElemType,与bo2-1.cpp中相应函数的形参类型ElemType&不同
{ // 初始条件:线性表L已存在
  // 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
  LinkList p=L->next;
  while(p)
  {
printf("%f*x^%d",L->coef,L->expn);
while(p->next)
printf("+");
p=p->next;
  printf("\n");
}
}


void AddPolyn(Polyn &P1,Polyn &P2){
LinkList h1,h2,q1,q2;
h1=P1,h2=P2; //h1,h2分别为指向P1,P2的头节点
q1=h1->next; q2=h2->next; //q1,q2分别指向P1,P2的当前节点

for(int i=1; q1 && q2 ;i++){
switch(compare(q1,q2)){
case -1:
q1=q1->next;
break;
case 0:
q1->coef += q2->coef;
q2=q2->next;
if(!q1->coef)
ListDelete(P1,i);
break;
case 1:
h2->next=q2->next;
h1->next=q2;
q2->next=q1;
q2=h2->next;
break;
}//switch
}//for
if(q2)
q1->next=q2;
free(P2);
}




void main()
{
Polyn P1,P2;
int m,n;
InitList(P1);
InitList(P2);

//创建两个多项式的链表
printf("输入m项的系数及指数\n");
printf("m=");
scanf("%d",&m);
CreatePolyn(P1,m);
printf("P1=");
ListTraverse(P1);

/* printf("输入n项的系数及指数\n");
printf("n=");
scanf("%d",&n);
CreatePolyn(P2,m);
printf("P2=");
ListTraverse(P2);
*/
//实现多项式相加
AddPolyn(P1,P2);
printf("P1+P2=");
ListTraverse(P1);
}

------解决方案--------------------
给你一个我很早时候写的
C/C++ code

#ifndef LINKLIST_H
#define LINKLIST_H

/******************* 线性表的单链表存储结构 ********************/

template <typename ElemType> class LinkList;

template <typename ElemType> class LNode  // 结点类
{
    friend class LinkList<ElemType>;
protected:
    ElemType data;  // 数据域
    LNode<ElemType> *next;  // 指针域

public:
    LNode<ElemType>() { }
    LNode<ElemType>(const ElemType &dt, LNode *nx) { data = dt; next = nx; }
    ~LNode<ElemType>() { }
    ElemType GetData() const { return data; }
    LNode *GetNext() const { return next; }
    void SetData(const ElemType &dt) { data = dt; }
    void SetNext(LNode *nx) { next = nx; }
};

template <typename ElemType> class LinkList
{
protected:
    LNode<ElemType> *head;  // 头指针

public:
    LinkList<ElemType>() { InitList(); }
    LinkList<ElemType>(const LinkList<ElemType> &list);  // 拷贝构造函数
    ~LinkList<ElemType>() { DestroyList(); }
    LNode<ElemType> *GetHead() const { return head; }
    void SetHead(LNode<ElemType> *ph) { head = ph; }
    void InitList();  // 构造一个空的单链表
    void DestroyList();  // 销毁单链表
    void ClearList();  // 将单链表置空
    bool ListEmpty() const { return (head->next == NULL); }  // 探空
    int ListLength() const;  // 返回单链表中数据元素的个数
    bool GetElem(int i, ElemType &e);  // 用e返回单链表第i个元素的值(算法2.8)
    int LocateElem(const ElemType &e);  // 返回单链表中第1个与e相等的值所在的位置
    bool PriorElem(const ElemType &cur, ElemType &pre);  // 用pre返回cur的前驱
    bool NextElem(const ElemType &cur, ElemType &nxt);  // 用nxt返回cur的后继
    bool ListInsert(int i, const ElemType &e);  // 插入(算法2.9)
    bool ListDelete(int i, ElemType *e = NULL);  // 删除(算法2.10)
    void ListTraverse(void (*visit)(const ElemType &e));  // 遍历
};

// 构造一个空的单链表
template <typename ElemType> void LinkList<ElemType>::InitList()
{
    head = new LNode<ElemType>;
    head->next = NULL;
}

// 销毁单链表
template <typename ElemType> void LinkList<ElemType>::DestroyList()
{
    LNode<ElemType> *p = head, *q;
    while (p != NULL)
    {
        q = p;
        p = p->next;
        delete q;
    }
}

// 拷贝构造函数
template <typename ElemType>
LinkList<ElemType>::LinkList<ElemType>(const LinkList<ElemType> &list)
{
    LNode<ElemType> *pt, *pl, *pn;
    this->head = new LNode<ElemType>;
    this->head->next = NULL;
    pt = this->head;
    for (pl = list.head->next; pl != NULL; pl = pl->next)
    {
        pn = new LNode<ElemType>(pl->data, NULL);
        pt->next = pn;
        pt = pn;
    }
}

 // 将单链表置空
template <typename ElemType> void LinkList<ElemType>::ClearList()
{
    LNode<ElemType> *p = head->next, *q;
    while (p != NULL)
    {
        q = p;
        p = p->next;
        delete q;
    }
    head->next = NULL;
}

// 返回单链表中数据元素的个数
template <typename ElemType> int LinkList<ElemType>::ListLength() const
{
    int length = 0;
    LNode<ElemType> *p;
    for (p = head->next; p != NULL; p = p->next)
        ++length;
    return length;
}

// 返回单链表中第1个与e相等的值所在的位置
template <typename ElemType>
int LinkList<ElemType>::LocateElem(const ElemType &e)
{
    int cnt = 0;
    LNode<ElemType> *p;
    for (p = head->next; p != NULL; p = p->next)
    {
        if (p->data == e)
            return cnt;
        else
            ++cnt;
    }
    return -1;
}

// 用pre返回cur的前驱
template <typename ElemType>
bool LinkList<ElemType>::PriorElem(const ElemType &cur, ElemType &pre)
{
    LNode<ElemType> *p;
    for (p = head; p->next != NULL; p = p->next)
    {
        if (p->next->data == cur)
        {
            if (p != head)
            {
                pre = p->data;
                return true;
            }
            else
                return false;
        }
    }
    return false;
}

// 用next返回cur的后继
template <typename ElemType>
bool LinkList<ElemType>::NextElem(const ElemType &cur, ElemType &nxt)
{
    LNode<ElemType> *p;
    for (p = head->next; p->next != NULL; p = p->next)
    {
        if (p->data == cur)
        {
            if (p != head)
            {
                nxt = p->next->data;
                return true;
            }
            else
                return false;
        }
    }
    return false;
}

template <typename ElemType>
void LinkList<ElemType>::ListTraverse(void (*visit)(const ElemType &e))
{
    LNode<ElemType> *p;
    for (p = head->next; p != NULL; p = p->next)
        visit(p->data);
}

// 算法2.8
// 用e返回单链表第i个元素的值
// 当第i元素存在时,其值赋给e,并返回true,否则返回false
template <typename ElemType>
bool LinkList<ElemType>::GetElem(int i, ElemType &e)
{
    int cnt = 0;
    LNode<ElemType> *p = head->next;  // 指向第1个结点
    while (p != NULL && cnt < i)
    {
        p = p->next;
        ++cnt;
    }
    if (p == NULL || cnt > i)  // 第i个元素不存在
        return false;
    e = p->data;  // 取第i个元素
    return true;
}

// 算法2.9
// 在带头结点的单链表中第i个元素之前插入元素e
// i的合法值为1 <= i <= length+1
template <typename ElemType>
bool LinkList<ElemType>::ListInsert(int i, const ElemType &e)
{
    LNode<ElemType> *p = head, *q;
    int j = -1;
    while (p != NULL && j < i - 1)  // 寻找第i-1个结点
    {
        p = p->next;
        ++j;
    }
    if (p == NULL || j > i - 1)  // i小于1或者大于表长加1
        return false;
    q = new LNode<ElemType>(e, p->next);  // 生成新结点
    p->next = q;  // 插入链表中
    return true;
}

// 算法2.10
// 在带头结点的单链表中,删除第i个元素之前元素,并由pe返回其值
// i的合法值为1 <= i <= length
template <typename ElemType>
bool LinkList<ElemType>::ListDelete(int i, ElemType *pe)
{
    LNode<ElemType> *p = head, *q;
    int j = -1;
    while (p->next != NULL && j < i - 1)  // 寻找第i个结点,并令p指向其前驱
    {
        p = p->next;
        ++j;
    }
    if (p->next == NULL || j > i - 1)  // 删除位置不合理
        return false;
    q = p->next;
    if (pe != NULL)
        *pe = q->data;
    p->next = q->next;  // 删除结点
    delete q;  // 释放结点
    return true;
}

#endif