数据结构笔记|C++

这篇博客详细介绍了C++实现的数据结构,包括线性表、栈、队列、字典、二叉树的遍历和操作,以及树、图的概念和遍历算法。还涉及了排序算法如插入排序、冒泡排序、堆排序等,并提到了二叉检索树、哈夫曼树、堆和优先队列等相关内容。
摘要由CSDN通过智能技术生成

1.数据结构与算法

2.数学预备知识

3.算法分析


4.线性表、栈和队列

4.1线性表

4.1.1线性表ADT(C++中ADT以抽象类实现)

#include<iostream>
using namespace std;

template<typename E>
class List{
   
private:
    void operater =(const List&){
   };
    List(const List&){
   };
public:
    List(){
   };
    virtual ~List(){
   };

    virtual void clear()=0;

    virtual void insert(const E& item)=0;

    virtual void append(const E& item)=0;
    
    virtual E remove()=0;

    virtual void moveToStart()=0;

    virtual void moveToEnd()=0;

    virtual void prev()=0;

    virtual void next()=0;

    virtual int length() const =0;

    virtual int currPos() const =0;

    virtual void moveToPos(int Pos)=0;

    virtual const E& getValue() const =0;

};

bool find(Link<int>& L,int k)//find单独实现
{
   
    int it;
    for(L.moveToStart();L.currPos()<L.length();L.next()){
   
        it=getValue();
        if(k==it)
            return true;
    }
    return false;
}

4.1.2顺序表的实现:

//顺序表的实现
template<typename E>
class AList:public List<E>{
   
private:
    int maxSize;
    int listSize;
    int curr;
    E* listArray;
public:
    Alist(int size=defaultSize){
   //constrcutor
        maxSize=size;
        listSize=curr=0;
        listArray = new E[maxSize];
    }

    ~AList(){
   delete [] listArray;}//destructor

    //Insert "it" at current position
    void insert(const E& it){
   
        Assert(listSize<maxSize,"list capacity exceeded");
        for(int i=listSize;i>curr;i--){
   
            listArray[i]=listArray[i-1];
        }
        listArray[curr]=it;
        listSize++;
    }

    void append(const E& it){
   //Append "it"
        Append(listSize<maxSize,"List capacity exceed");
        listArray[listSize++]=it;
    }
    
    //Remove and return the current element
    E remove(){
   
        Assert((cur>=0)&&(cur<listSize),"No element");
        E it = listArray[curr];
        for(int i=curr;i<listSize-1;i++)
            list[i]=list[i+1];
        listSize--;
        return it;
    }

    void moveToStart(){
   curr=0};
    void moveToEnd(){
   curr=listSize-1};
    void prev(){
   if(curr>0) curr--};
    void next(){
   if(curr<listSize) curr++};//可以是12|13->12 13|

    int length() const {
   return listSize;}

    int currPos() const{
   return curr};

    void moveToPos(int pos){
   
        Assert(pos>=0&&pos<=listSize,"Pos out of range");
        curr=pos;
    }

    const E& getValue() const{
   //return the current element
        Assert(curr>=0&&curr<listSize,"No element");
        return listArray[curr];
    }
};

4.1.3链表实现

//链表实现Linked list implementation
template<typename E>
class Link{
   
private:
    E element;
    Link *next;

    //constructors
    Link(const E& e,Link* p=NULL){
   element=e;next=p;}
    Link(Link* p=NULL){
   next=p;}
};

template<typename E> 
class LList:public List<E>{
   
private:
    Link<E>* head;
    Link<E>* tail;
    Link<E>* curr;
    int cnt;//size of list

    void init(){
   //Initialization helper method
        head=tail=curr=new Link<E>;
        cnt=0;
    }

    void removeall(){
   //Return link nodes to free store
        while(head!=NULL){
   
            curr=head;
            head=head->next;
            delete curr;
        }
    }

public:
    LList(int size=defaultSize){
   init();}
    ~LList(){
   removeall();}

    void print(){
   };
    void clear(){
   removeall();init();}

    void insert(const E& it){
   
        Link<E>* p=new Link<E>;
        p->element=it;
        p->next=curr->next;
        curr->next=p;

        if(tail==curr)
            tail=curr->next;
        cnt++;
    }

    void append(const E& it){
   
        tail->next=new Link(it,NULL);
        tail=tail->next;
        cnt++;
    }

    E remove(){
   
        Assert(curr->next!=NULL,"No element");
        Link<E>* temp=curr->next;
        E it=curr->next->element;
        if(tail==curr->next)//Reset tail
            tail=curr;
        curr->next=curr->next->next;
        delete temp;
        cnt--;
        return it;
    }

    void moveToStart(){
   curr=head;}
    void moveToEnd(){
   curr=tail;}

    void prev(){
   
        if(curr=head)return;
        Link<E>* temp=head;
        while(temp->next!=curr)temp=temp->next;
        curr=temp;
    }

    void next(){
   
        if(curr==tail)return;
        curr=curr->next;
    }

    int length() const{
   return cnt;}

    int currPos() const{
   
        Link<E>* temp=head;
        int i;
        for(i=0;temp!=curr;i++)
            temp=temp->next;
        return i;
    }

    void moveToPos(int pos){
   
        Assert(pos>=0&&pos<=cnt,"Position out of range");
        curr=head;
        for(int i=0;i<=pos;i++)
            curr-curr->next;
    }

    const E& getValue() const{
   
        Assert(curr->next!=NULL,"No value");
        return curr->next->element;
    }
};

4.1.4freelists可利用空间表

//链表实现Linked list implementation
template<typename E>
class Link{
   
private:
    E element;
    Link *next;

    //constructors
    Link(const E& e,Link* p=NULL){
   element=e;next=p;}
    Link(Link* p=NULL){
   next=p;}


    //Freelists
    //Linked list implementation
    //没有头结点,只对头指针操作,头插法
    static Link<E>* freelist;

public:
    void* operator new(size_t){
   //overload new
        if(freelist==NULL)return ::new Link;
        Link<E>* temp=freelist;
        freelist=freelist->next;
        return temp;
    }

    void operator delete(void* ptr){
   
        (Link<E>*)ptr->next=freelist;
        freelist=((Link<E>*)ptr);
    }
};

//The freelist head pointer is actually created here
template<typename E>
Link<E>* Link<E>::freelist=NULL;

4.1.5 双链表

//Doublely Linked List implementation
template<typename E>
class DLink{
   
private:
    static DLink* freelist;
public:
    E element;
    DLink<E>* next;
    DLink<E>* prev;

    DLink(const E& e,DLink<E>* n=NULL,DLink<E>* p=NULL){
   
        element=e;
        next=n;
        prev=p
    }

    DLink(DLink<E>* n=NULL,DLink<E> p=NULL){
   
        next=n;
        prev=p;
    }

    void* operator new(size_t){
   //overload new
        if(freelist==NULL)return ::new Link;
        Link<E>* temp=freelist;
        freelist=freelist->next;
        return temp;
    }

    void operator delete(void* ptr){
   
        (Link<E>*)ptr->next=freelist;
        freelist=((Link<E>*)ptr);
    }
};

template<typename E>
DLink<E>* DLink<E>::freelist=NULL;

template<typename E>
class DList:public List{
   
private:
    DLink<E>* head;
    DLink<E>* curr;//还是指当前节点的上一个
    DLink<E>* tail;//双链表包含尾结点
    int cnt;
public:
    // void insert(const E& it){
   
    //     curr->next=curr->next->prev=new DLink(it,curr,curr->next);
    //     cnt++;
    // }

    void insert(const E& it){
   
        DLink<E>* temp=new DLink<E>(it);
        curr->next->prev=temp;
        temp->next=curr->next;
        temp->prev=curr;
        curr->next=temp;
        cnt++;
    }
    // void append(const E& it){
   
    //     tail->prev->next=tail->prev=new DLink(it,tail->prev,tail);
    //     cnt++;
    // }
    void append(const E& it){
   
        DLink<E>* temp=new DLink<E>(it);
        tail->prev->next=temp;
        temp->prev=tail->prev;
        temp->next=tail;
        tail->prev=temp;
        cnt++;
    }

    E remove(){
   
        if(curr->next==tail)
            return NULL;
        DLink<E>* it=curr->next;
        E it=it->element;
        curr->next->next->prev=curr;
        curr->next=curr->next->next;
        delete it;
        cnt--;
        return it;
    }

    void prev(){
   if(curr!=head)curr=curr->prev;}

};

4.2 栈

4.2.1栈ADT

#include<bits/stdc++.h>
using namespace std;
//Stack ADT
//Stack avstract class
template<typename E>
class Stack{
   
private:
    void operator=(const Stack&){
   };
    Stack(const Stack&){
   };

public:
    Stack(){
   };
    virtual void clear()=0;
    virtual void push(const E& it)=0;
    virtual E pop()=0;
    virtual const E& top() const =0;
    virtual int length()=0;
};

4.2.2数组实现

//Array-based stack implementation
template<typename E>
class AStack:public Stack<E>{
   
private:
    int maxSize;
    int top;//index for the top element +1
    E* listArray;
public:
    AStack(int size=defaultSize){
   
        maxSize=size;
        top=0;
        listArray=new E[size];
    }
    ~AStack(){
   delete[]listArray;}

    void clear(){
   top=0;}

    void push(const E& it){
   
        Assert(top!=maxSize,"Stack is full");
        listArray[top++]=it;
    }

    E pop(){
   
        Assert(top!=0,"No element");
        return listArray[--top];
    }

    const E& top(){
   
        Assert(top!=0,"Stack is empty");
        return listArray[top-1];
    }
    int <
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值