代码改变世界

链表实现多项式相加

2017-11-09 10:43  雄风狂飙  阅读(206)  评论(0)    收藏  举报

1.第一部分定义链表结构和相关操作。文件名称:comm.h

#ifndef _COMM_H__
#define _COMM_H__
#include <iostream>
#include <string>
#include <string.h>

using namespace std;

string trim(string &strIn);

typedef struct Element
{
    float index;
    int exp;
}Element;

typedef int Status;
#define ERROR 0
#define OK    1
#define OVERFLOW -1
typedef struct LNode
{
    Element data;
    struct LNode *next;	
}	*Link,*Position;
typedef struct
{
    Link head;
    Link tail;
    int  len;	
}LinkList;
    
namespace linkListName{
    
    
    Status InitList(LinkList &L)
    {
        Link p = (Link)	malloc(sizeof(LNode));
        if( !p )
        	return ERROR;
        p->next = NULL;
        L.head = p;
        L.tail = p;
        L.len = 1;
        return OK;
    }
    void Destroy(LinkList &L)
    {
        Link p = L.head;
        Link q;
        while(p!=L.tail)
        {
        	q=p;
        	++p;
        	if(q) free(q);
        }   	
    }
    
    Status MakeNode(Link &p,Element e)
    {
        Link ptr = (Link)malloc(sizeof(LNode));
        if(!ptr) return ERROR;
        ptr->data = e;
        ptr->next = NULL;
        p=ptr;
        return OK;
    }
    
    void FreeNode( Link p )
    {
        if(p)
        	free(p);	
    }
    
    Link GetHead(LinkList &L)
    {
        return L.head;	
    }
    
    Status LinkEmpty(LinkList &L)
    {
        return L.len == 0;	
    }
    
    int LengthLink(LinkList &L)
    {
        return L.len;	
    }
    
    void ClearLink(LinkList &L)
    {
        	
    }
    
    Status LocateElem(LinkList &L,Link &p,int i)
    {
        if( i > L.len)
        	return OVERFLOW;
        Link ha = GetHead(L);
        int j=1;
        while( j < i + 1  ) 
        {
        	j++;
        	ha = ha->next;
        }	
        p = ha; 
        return OK;
    }
    
    Status InsAfterElem(LinkList &L,Link &p,Element e)
    {
    	  Link ptr;
        if( !MakeNode(ptr,e) )  
            return OVERFLOW;
        if( !p->next )
        {
            L.tail = ptr;
        }

        ptr->next = p->next;
        p->next=ptr; 
        ++L.len; 
        return OK;
    }
    
    Status DelAfterElem(LinkList &L,Link p)
    {
        if(!p->next)
        	  return OVERFLOW;
        if( !(p->next)->next )
            L.tail = p;
        Link q = p->next;
        p->next = q->next;
        FreeNode(q);
        return OK;    	
    }
	  void SetElem(Link p,Element e)
	  {
	      p->data = e;	
	  }
}


#endif

 2.第二部分添加main函数以及多项式相加函数等。文件名称:LinkListTest.cpp.代码如下:

  1 #include <iostream>
  2 #include "..\..\include\comm.h"
  3 #include "..\..\include\MainFunc.h"
  4 using namespace std;
  5 using namespace linkListName;
  6 
  7 int comp(Element a,Element b)
  8 {
  9     if(a.exp == b.exp)
 10         return 0;    
 11     if(a.exp < b.exp)
 12         return -1;
 13     else return 1;
 14 }
 15 void Print(LinkList pa)
 16 {
 17     Link la = GetHead(pa);    
 18     la = la->next;
 19     while(la)
 20     {
 21           Element a = la->data;
 22         cout<<a.index<<"*X^"<<a.exp<<"+";
 23         la=la->next;
 24     }
 25     cout<<"\n"<<endl;
 26 }
 27 void addPolynomial(LinkList pa,LinkList pb,LinkList &pc,
 28     int (*compare)(Element ,Element ) )
 29 {
 30     Link ha = GetHead(pa);
 31     Link hb = GetHead(pb);      
 32     Link la = ha->next;
 33     Link lb = hb->next;
 34     
 35     Element a = la->data;
 36     Element b = lb->data;
 37     Link ptmp;
 38     Link pcur;
 39     
 40     while( la && lb )
 41     {   
 42           a = la->data;
 43           b = lb->data;
 44           
 45         int ret = compare(a,b); 
 46         switch(ret)
 47         {
 48             case -1:
 49                 LocateElem(pc,pcur,pc.len-1);
 50                 InsAfterElem(pc,pcur,a);
 51                 la = la->next;
 52                 break;
 53             case 0:
 54                   if( !( (a.index + b.index) > -0.005 && (a.index + b.index) < 0.005 )  )
 55                   {
 56                       Element c;
 57                       c.index = a.index + b.index;
 58                       c.exp = a.exp;
 59                       LocateElem(pc,pcur,pc.len-1);
 60                     InsAfterElem(pc,pcur,c);     
 61                   }
 62                   la = la->next;
 63                 lb = lb->next;
 64                 break;
 65             case 1:
 66                 LocateElem(pc,pcur,pc.len-1);
 67                 InsAfterElem(pc,pcur,b);
 68                 lb = lb->next;
 69                 break;    
 70               default:
 71                     break;
 72         }           
 73     }
 74          
 75     while( la != (pa.tail)->next )  
 76     {
 77         a = la->data;
 78         LocateElem(pc,pcur,pc.len-1);
 79         InsAfterElem(pc,pcur,a);
 80         la = la->next;    
 81     }
 82     while( lb != (pb.tail)->next )
 83     {
 84           
 85         a = lb->data;
 86         LocateElem(pc,pcur,pc.len-1);
 87         InsAfterElem(pc,pcur,a);
 88         lb = lb->next;    
 89     }    
 90 }
 91 
 92 
 93 void func1()
 94 {
 95       Element a;
 96       a.index=1;
 97       a.exp = 2;
 98       Element b;
 99       b.index=3;
100       b.exp = 4;
101       Element c;
102       c.index=2;
103       c.exp = 6;
104     Element array1[3] = {a,b,c}; 
105     
106     Element aa;
107       aa.index=1;
108       aa.exp = 2;
109       Element ab;
110       ab.index=3;
111       ab.exp = 3;
112       Element ac;
113       ac.index=1;
114       ac.exp = 4;
115     Element array2[3] = {aa,ab,ac}; 
116     
117     LinkList pa;
118     LinkList pb;
119     InitList(pa);
120     InitList(pb);
121     Link pcur;
122     for(int i = 0 ; i < 3 ; i++)
123     {
124           
125         LocateElem(pa,pcur,pa.len-1);
126         
127         InsAfterElem(pa,pcur,array1[i]);   
128         
129         LocateElem(pb,pcur,pb.len-1);
130         InsAfterElem(pb,pcur,array2[i]);    
131     }      
132  
133     LinkList pc;
134     InitList(pc); 
135     addPolynomial(pa,pb,pc,comp );
136     cout<<"输入的第一个多项式:\n"<<endl;
137     Print(pa);
138     cout<<"输入的第二个多项式:\n"<<endl;
139     Print(pb);
140     cout<<"相加后的结果:"<<endl;
141     Print(pc);
142         
143     
144 }
145 
146 int main()
147 {
148       cout<<"before func1 "<<endl;
149     func1();
150     cout<<"after func1 "<<endl;
151     return 0;
152 }
View Code

 3.编译文件,本人使用的是mingw32-make

LinkList.exe:LinkListTest.cpp
 g++ -m64 -I../../include -L../../../lib LinkListTest.cpp -lcomm -o LinkList.exe
#move ./test.exe ../../../bin/

本人文件目录说明:

H:\myProject\src\include\comm.h

H:\myProject\src\module\LinkListTest\LinkListTest.cpp

4.运行结果:

H:\myProject\src\module\LinkListTest>LinkList

before func1 输入的第一个多项式:

1*X^2+3*X^4+2*X^6+

输入的第二个多项式:

1*X^2+3*X^3+1*X^4+

相加后的结果: 2*X^2+3*X^3+4*X^4+2*X^6+

after func1

H:\myProject\src\module\LinkListTest>