双向循环链表实现大数四则运算

本学期数据结构课程设计的第一个作业。

初步想法:
使用 F F T FFT FFT优化乘法
n n n为大数的位数。
则乘法复杂度: O ( n 4 l o g ( n 4 ) ) O(\frac{n}{4}log(\frac{n}{4})) O(4nlog(4n))
(压位处理,其中链表每一个节点存储四位数据)

除法则枚举答案的每一位,按位更新,复杂度 O ( n 2 16 ) O(\frac{n^2}{16}) O(16n2)

代码:(详细注释)

#include<cstdio>
#include<cmath>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
typedef int ElemType;
#define OK 1;
#define Error 0;
#define Wrong -1;
#define Over_Flow 0;

//双向循环链表实现部分

class LinkNode{
          //链表结点
public:
    ElemType data;
    LinkNode *next,*prev;
};

class LinkList{
          //带头节点的双向循环链表
public:
    LinkNode *head;
    int len;
};

void InitList(LinkList &L){
      //初始化链表
    L.len = 0;
    L.head = new LinkNode;
    L.head->next = L.head->prev = L.head;
}

void ClearList(LinkList &L){
     //清空链表
    LinkNode *p = L.head->next,*q;
    while(p != L.head){
   
        q = p->next;
        delete p;
        p = q;
    }
    L.head->next = L.head->prev = L.head;
    L.len = 0;
}

void DestroyList(LinkList &L){
     //销毁链表
    ClearList(L);
    delete L.head;
    L.head = NULL;
}

bool ListEmpty(LinkList &L){
        //判断链表是否为空
    if(L.len) return false;
    else      return true;
}

ElemType ListLength(LinkList& L){
    //求链表长度
    return L.len;
}

bool InsertList(LinkList& L,ElemType data,int pos){
     //在链表的第pos个位置之后插入数据data
    if(pos<0 || pos>L.len) return Error;             // 0 <= pos <= L.len
    LinkNode *p = L.head;

    if(pos <= L.len-pos+1){
     //通过后继寻找位置
        for(int i=1 ;i<=pos ;i++){
   
            if(p == NULL) return Error;
            p = p->next;
        }
    }
    else{
                       //通过前驱寻找位置
        for(int i=1 ;i<=L.len-pos+1 ;i++){
   
            if(p == NULL) return Error;
            p = p->prev;
        }
    }
    LinkNode *q = new LinkNode;
    q->data = data;
    q->next = p->next;
    q->prev = p;
    p->next->prev = q;
    p->next = q;
    L.len++;
    return OK;
}

bool QueryList(LinkList& L,int pos,ElemType& e){
     //询问链表第pos个位置的值,通过e返回
    if(pos<1 || pos>L.len)  return Error;          // 1 <= pos <= L.len
    LinkNode *p = L.head;

    if(pos <= L.len-pos+1){
     //通过后继寻找位置
        for(int i=1 ;i<=pos ;i++){
   
            if(p == NULL) return Error;
            p = p->next;
        }
    }
    else{
                       //通过前驱寻找位置
        for(int i=1 ;i<=L.len-pos
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值