3.线性表的链式表示和实现
       链表是非随机存取的存储结构
       线性表的单链表存储结构
       typedef struct LNode
       {
              ElemType       data;
              struct LNode  *next;
       }LNode, *LinkList;
       1)单链表的取元素操作:
       Status GetElem_L(LinkList L, int i, ElemType &e)
       {
              p = L->next;
              j = 1;
              while (p && j < i)
              {
                     p = p -> next; ++ j;
              }
              if ( !p || j > i)
                     return ERROR;
              e = p -> data;
              return OK;
       }
       其时间复杂度为O(n)
       2)单链表的插入操作:
       Status ListInsert_L(LinkList &L, int i, ElemType e)
       {
              p = L;
              j = 0;
              while (p && j < i -1)
              {
                     p = p -> next;
                     ++ j;
              }
              if (!p || j > i - 1)
                     return ERROR;
              s = (LinkList) malloc(sizeof(LNode));
              s -> data = e;
              s -> next = p -> next;
              p -> next = s;
              return OK;
       }
       其时间复杂度为O(n)
       3)单链表的删除操作:
       Status ListDelete_L(LinkList &L, int i, ElemType &e)
       {
              p = L;
              j = 0;
              while (p -> next && j < i - 1)
              {
                     p = p -> next;
                     ++ j;
              }
              if (!(p -> next) || j > i - 1)
                     return ERROR;
              q = p -> next;
              p-> next = q ->next;
              e = q -> data;
              free(q);
              return OK;
       }
       其时间复杂度为O(n)
       4)单链表的建立操作:    
       void CreateList_L(LinkList &L, int n)
       {
              L = (LinkList) malloc(sizeof(LNode));
              L->next = NULL;
              for (i = n; i > 0; i ++)
              {
                     p = (LinkList) malloc(sizeof(LNode));
                     scanf(&p -> data);
                     p -> next = L -> next;
                     L -> next = p;
              }
       }
       其时间复杂度为O(n)
       5)单链表的归并操作:
       void MergeList_L(LinkList &La, LinkList & Lb, LinkList & Lc)
       {
              pa = La -> next;
              pb = Lb -> next;
              Lc = pc = La;
              while (pa && pb)
              {
                     if (pa -> data <= pb -> data)
                     {
                            pc -> next = pa;
                            pc = pa;
                            pa = pa -> next;
                     }
                     else
                     {
                            pc-> next = pb;
                            pc = pb;
                            pb = pb -> next;
                     }
              }
              pc -> next = pa ? pa : pb;
              free(Lb);
       }
      
       线性表的双向链表存储结构
       typedef struct DuLNode
       {
              ElemType              data;
              struct DuLNode     *prior;
              struct DuLNode     *next;
       }DuLNode, *DuLinkList;
1)  双向链表的结点插入操作:
       Status ListInsert_DuL(DuLinkList &L, int i, ElemType e)
       {
              if (! (p = GetElemP_Dul(L, i)))
                     return ERROR;
              if (! (s = (DuLinkList)malloc(sizeof(DuLNode))))
                     return ERROR;
              s -> data = e;
              s -> prior = p -> piror;
              p -> prior -> next = s;
              s -> next = p;
              p -> prior = s;
              return OK;
       }
2)  双向链表的结点删除操作:
Status ListDelete_DuL(DuLinkList &L, int i, ElemType &e)
{
       if (! (p = GetElemP_DuL(L, i)))
              return ERROR;
       e = p -> data;
       p -> prior -> next = p -> next;
       p -> next -> prior = p -> prior;
       free(p);
}
 
4 一元多项式的表示及相加
       抽象数据类型一元多项式的定义如下:
       ADT Polynomial
       {
              数据对象:D = {|TermSeti = 1, 2, …, m, m0
                                   TermSet中的每个元素包含一个表示系数的实数和表示指数的整数}
              数据关系:R1 = {<, > | , D,且中的指数值<中的指数值,
                                          i = 2, …, n}
              基本操作:
              CreatePolyn(&P, m)
              操作结果:输入m项的系数的指数,建立一元多项式P
              DestroyPolyn(&P)
              初始条件:一元多项式P已存在。
              操作结果:销毁一元多项式P
              PrintPolyn(P)
              初始条件:一元多项式P已存在。
              操作结果:打印输出一元多项式P
              PolynLength(P)
              初始条件:一元多项式P已存在。
              操作结果:返回一元多项式P中的项数。
              AddPolyn(&Pa, &Pb)
              初始条件:一元多项式PaPb已存在。
              操作结果:完成多项式相加运算,即:Pa = Pa + Pb,并销毁一元多项式Pb
              SubtractPolyn(&Pa, &Pb)
              初始条件:一元多项式PaPb已存在。
              操作结果:完成多项式相减运算,即Pa = Pa – Pb,并销毁一元多项式Pb
              MultiplyPolyn(&Pa, &Pb)
              初始条件:一元多项式PaPb已存在。
              操作结果:完成多项式相乘运算,即Pa = Pa Pb,并销毁一元多项式Pb  
       }ADT Polynomial
 
       多项式相加的运算规则如下:
              假设指针qaqb分别指向多项式A和多项式B中当前进行比较的某个结点,则           比较两个结点中的指数项,有下列3种情况:1)指针qa所指结点的指数值小于指针    qb所指结点的指数值,则应摘取qa指针所指结点插入到“和多项式”链表中去;2)   qa所指结点的指数值大于指针qb所指结点的指数值,则应摘取qb指针所指结点插 入到“和多项式”链表中去;3)指针qa所指结点的指数值等于指针qb所指结点的指          数值,则将两个结点中的系数相加,若和数不为零,则修改qa所指结点的系数值,同         时释放qb所指结点;反之,从多项式A的链表删除相应结点,并释放指针qaqb 指结点。