线性表的抽象数据类型的实现

本文详细介绍了如何使用C语言实现线性表的抽象数据类型,包括线性表的基本操作如插入、删除、查找等,并探讨了其在数据结构中的应用。

实验内容(方法和步骤):

设计一个一元稀疏多项式简单计算器。

要求:

(1)输入并建立多项式

(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……,cn,en,其中n为多项式的项数,ci和ei分别为第i项的系数和指数,序列按指数降序排列。

(3)实现两个多项式相加并输出

(4)实现俩个多项式相减并输出

(5)实现两个多项式相乘并输出

代码源码:

实现加减法

#include <stdio.h>         
#include <malloc.h>           
#define ERROW 0 
 
typedef struct Lnode {
    float c;
    int e;
    struct Lnode* next;
}Lnode;
 
Lnode *Creat_list();
Lnode *addition(Lnode *head1, Lnode *head2);
Lnode *substraction(Lnode *head1, Lnode *head2);
Lnode *List_insert(Lnode *head,Lnode *p);
void List_Traverse(Lnode *head);
void List_sort();
 
int main() {
    int judge;
    Lnode *head1, *head2, *head3;
    head1 = Creat_list();
    head2 = Creat_list();
    head3 = addition(head1, head2);
    head4 = substraction(head1, head2);
    head5 = Mult(head1,head2);
    }
    List_Traverse(head3);
    List_Traverse(head4);
    List_Traverse(head5);
    
}//main
 
Lnode *List_insert(Lnode *header, Lnode *p) {
    Lnode *rear = NULL;
    rear = header;
    
    if (header == NULL) {
        header = p;
        p->next = NULL;
    }//if
    if(rear != NULL) {
        while (1) {
            if (rear->next == NULL) {
                break;
            }//if
            rear = rear->next;
        }//while
        rear->next = p;
        p->next = NULL;
    }//if
    return header;
 
}//List_insert
 
Lnode *Creat_list(){
    Lnode *head = NULL;
    Lnode *p = NULL, *q = NULL;
 
    if (!(head = (Lnode *)malloc(sizeof(Lnode)))) {
        return ERROW;
     }
    if (!(q = (Lnode *)malloc(sizeof(Lnode)))) {
        return ERROW;
    }
    head->next = q;
    p = q;
    p->next = NULL;
 
 
    while (1) {
        scanf("%f%d", &q->c, &q->e);
        if (getchar()!='\n') {
            if (!(q = (Lnode *)malloc(sizeof(Lnode)))) {
                return ERROW;
            }
            p->next = q;
            p = q;
            p->next = NULL;
        }
        else {
            break;
        }//else
    }//while
 
    return head;
}//Creat_list
  
Lnode *addition(Lnode *head1, Lnode *head2) {
    float c;
    Lnode *p1 = NULL, *p2 = NULL, *p = NULL, *q = NULL, *head = NULL, *header = NULL;
    
    p1 = head1->next;
    p2 = head2->next;
    if (!(head = (Lnode *)malloc(sizeof(Lnode)))) {
        return ERROW;
    }
    header = head->next;
    header = NULL;
 
    while (p1 != NULL&&p2 != NULL) {
        if (p1->e > p2->e) {
            if (!(p = (Lnode *)malloc(sizeof(Lnode)))) {
                return ERROW;
            }//if
            p->c = p1->c;
            p->e = p1->e;
            p1 = p1->next;
 
            header = List_insert(header, p);
        }//if
        else if(p1->e == p2->e){
            if (!(p = (Lnode *)malloc(sizeof(Lnode)))) {
                return ERROW;
            }
            p->c = p1->c + p2->c;
            p->e = p1->e;
            p1 = p1->next;
            p2 = p2->next;
 
            header = List_insert(header, p);
        }//else if
        else if (p1->e < p2->e) {
            if (!(p = (Lnode *)malloc(sizeof(Lnode)))) {
                return ERROW;
            }//if
            p->c = p2->c;
            p->e = p2->e;
            p2 = p2->next;
 
            header = List_insert(header, p);
        }//else if
    }//while
    while (p1 == NULL) {
        if (p2 == NULL) {
            break;
        }//if
 
        header = List_insert(header, p2);
        p2 = p2->next;
    }//while
    while (p2 == NULL) {
        if (p1 == NULL) {
            break;
        }//if
 
        header = List_insert(header, p1);
        p1 = p1->next;
    }//while
 
    return header;
}//addition
  
Lnode *substraction(Lnode *head1, Lnode *head2) {
    Lnode *p = head2, *head = NULL;
 
    while (p != NULL) {
        p->c = -1 * p->c;
        p = p->next;
    }//while
 
    head = addition(head1, head2);
 
    return head;
}//substraction
 
Polynomial Mult(Polynomial P1,Polynomial P2)
{
    Polynomial P,Rear,t1,t2,t;
    int c,e;
    if(!P1||!P2) return NULL;
    t1=P1;
    t2=P2;
    P=(Polynomial)malloc(sizeof(struct PolyNode));
    P->link=NULL;
    Rear=P;
    while(t2){
        Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
        t2=t2->link;    
    }
    t1=t1->link;
    while(t1){
        t2=P2;
        Rear=P;    
        while(t2){
            e=t1->expon+t2->expon;
            c=t1->coef*t2->coef;
            while(Rear->link&&Rear->link->expon>e)    
                Rear=Rear->link;
            if(Rear->link&&Rear->link->expon==e){    
                if(Rear->link->coef+c)            
                    Rear->link->coef+=c;
                else{                                
                    t=Rear->link;
                    Rear->link=t->link;
                    free(t);
                }
            }else{                                        
                t=(Polynomial)malloc(sizeof(struct PolyNode));    
                t->coef=c;t->expon=e;
                t->link=Rear->link;                                
                Rear->link=t;Rear=Rear->link;
            }
            t2=t2->link;
        }
        t1=t1->link;
    }
    t2=P;
    P=P->link;
    free(t2);

    return P;
}
 
void List_Traverse(Lnode *head) {
    Lnode *p = head;
    if (p == NULL) {
        printf("zero");
    }
    while (p != NULL) {
        printf("%f %d ", p->c, p->e);
        p = p->next;
    }//while
}//List_Traverse
 

实现乘法

#include <stdio.h>
#include <malloc.h> 

 typedef struct PolyNode *Polynomial;
 struct PolyNode{
    int coef;
    int expon;
    Polynomial link;
 };

 void Attach(int c,int e,Polynomial *pRear) //pRear是指针的指针 
 {
    Polynomial P;

    P=(Polynomial)malloc(sizeof(struct PolyNode));
    P->coef=c; //对新结点赋值 
    P->expon=e;
    P->link=NULL;
    (*pRear)->link=P; //修改pRear的值 
    *pRear=P;
 }
 Polynomial ReadPoly()
 {
    Polynomial P,Rear,t;
    int c,e,N;

     scanf("%d",&N);
     P=(Polynomial)malloc(sizeof(struct PolyNode)); //链表头空结点 
     P->link=NULL;
     Rear=P;
    while(N--){
        scanf("%d%d",&c,&e);
        Attach(c,e,&Rear); //将当前项插入多项式尾部 

     }
     t=P;P=P->link;free(t); //删除临时生成的头结点 
     return P;
 }

 Polynomial Add(Polynomial P1,Polynomial P2)
 {
    Polynomial front,rear,temp;
    int sum;
    rear=(Polynomial)malloc(sizeof(struct PolyNode));
    front=rear; /*由front记录结果多项式链表头结点*/
    while(P1&&P2){ /*当两个多项式都有非零项待处理时*/ 
        if(P1->expon==P2->expon){
            sum=P1->coef+P2->coef;
            if(sum){
            Attach(sum,P1->expon,&rear);
            P1=P1->link;
            P2=P2->link;

            }else{
                P1=P1->link;
                P2=P2->link;

             }
         }else if(P1->expon>P2->expon){
            Attach(P1->coef,P1->expon,&rear);
            P1=P1->link;
         }else{
            Attach(P2->coef,P2->expon,&rear);
            P2=P2->link;
         }
     }
     /*将未处理完的另一个多项式的所有节点依次复制到结果多项式中去*/ 
     while(P1){
        Attach(P1->coef,P1->expon,&rear);
        P1=P1->link;
     }
     while(P2){
        Attach(P2->coef,P2->expon,&rear); 
        P2=P2->link;
     }
    rear->link=NULL;
    temp=front;
    front=front->link; /*令front指向结果多项式第一个非零项*/ 
    free(temp);        /*释放临时空表头结点*/ 
    return front;
  } 

/*采用逐项插入的方法,将P1当前项乘以P2的当前项,并插入到结果多项式中,关键是要找到插入的位置*/  
/*初始结果多项式由P1第一项乘以P2各项获得*/ 
Polynomial Mult(Polynomial P1,Polynomial P2)
{
    Polynomial P,Rear,t1,t2,t;
    int c,e;

    if(!P1||!P2){
        return NULL;
    }
    t1=P1;t2=P2;
    P=(Polynomial)malloc(sizeof(struct PolyNode));P->link=NULL;
    Rear=P;
    while(t2){ //P1第一项乘以P2各项得到初始结果多项式 
        Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);

        t2=t2->link;
    }
    t1=t1->link;
    while(t1){
        t2=P2;Rear=P;

        while(t2){
            e=t1->expon+t2->expon;
            c=t1->coef*t2->coef;
            while(Rear->link&&Rear->link->expon>e)
            Rear=Rear->link;
            if(Rear->link&&Rear->link->expon==e){
                if(Rear->link->coef+c)
                 Rear->link->coef+=c;
                else{
                    t=Rear->link;
                    Rear->link=t->link;
                    free(t);
                }
            }
            else{
                t=(Polynomial)malloc(sizeof(struct PolyNode));
                t->coef=c;
                t->expon=e;
                t->link=Rear->link;
                Rear->link=t;
                Rear=Rear->link;
            }
            t2=t2->link;
            //printf("%d,%d\n",Rear->coef,Rear->expon);


        }
        t1=t1->link; 
    }
    t2=P;P=P->link;free(t2);
    return P;

}

 void PrintPoly(Polynomial P)
 {
    int flag=0;  //辅助调整输出格式用 
    if(!P){
        printf("0 0\n");
         return;
     } 
     while(P){
        if(!flag)
         flag=1;
        else 
          printf(" ");
          printf("%d %d",P->coef,P->expon);
          P=P->link;
     }
 } 
 int main()
 {
    Polynomial P1,P2,PS,PP;
    P1=ReadPoly();

    P2=ReadPoly();

    PP=Mult(P1,P2);
    PrintPoly(PP);
    printf("\n");
    PS=Add(P1,P2);
    PrintPoly(PS); 

    return 0;
 }
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值