LinkedList链表的使用

数据结构复习的第一天,从最简单的LinkedList开始,写这个代码的时候,没有遇到太难解决的问题, 大笑,啊,果然是自己进步了。除了c++的语法有些还不太熟悉以外,LinkedList理解起来是没有难度的,基本操作,增删改查。下面是代码:
//
//  main.cpp
//  LinkListDemo
//
//  Created by xin wang on 4/14/15.
//  Copyright (c) 2015 xin wang. All rights reserved.
//

#include <iostream>

class OutOfBounds {
public:
    OutOfBounds(){
        std::cout<<"out of bounds"<<std::endl;
    }
};

class Nomen{
public:
    Nomen(){
        std::cout<<"Nomen error"<<std::endl;
    }
};

template<class T>
class LinkList{
public:
    
    LinkList(int Maxsize=10);
    ~LinkList(){delete []element;}//析构函数
    bool isEmpty()  {return length == 0;}//判断是否为空
    int Length() const{return length;};//返回链表的长度
    bool Find(int k,T &x)const;//返回是否存在某个元素
    int Search(const T& x)const;//寻找某个元素在链表中的位置
    LinkList<T>& Delete(int k,T& x);//删除某个元素
    LinkList<T>& Insert(int k,const T& x);//插入某个元素
//    void OutPut(ostream & out)const;
    
private:
    T *element;
    int MaxSize;
    int length;
    
    
};

//构造函数
template <class T>
LinkList<T>::LinkList(int MaxLinkSize){
    MaxSize = MaxLinkSize;
    element = new T[MaxLinkSize];
    length=0;
}

//链表中是否存在第某个值,
//如果存在的话,就把他取出来放进x中,如果不存在的话,就返回false
template <class T>
bool LinkList<T>::Find(int k, T& x)const{
    if (k<1||k>length) {
        return false;
    }
    x = element[k-1];
    return true;
    
}

//查找链表中是否存在某个元素,
//如果存在的话,就返回他的位置,如果不存在的话,就返回0;
template <class T>
int LinkList<T>::Search(const T& x)const{
    for (int i=0;i<length; i++) {
        if(element[i]==x){
            return i++;
        }
    }
    return 0;
}

//删除链表中的第k个元素,如果找到这个元素的话,就将其长度减1,
//返回这个链表,如果不存在的话,就抛出异常
template <class T>
LinkList<T>& LinkList<T>::Delete(int k, T& x){
    if (Find(k, x))
        for (int i=0; i<length; i++) {
            element[i-1]=element[i];
        }
        length--;
        return *this;

    
    
}

//往链表中的第几个位置插入插入元素,如果位置不在数组的范围内,就抛出异常
//如果长度==最大长度的话,就不能往里面插了,也会抛出异常,插入的时候,把那个位置之后的元素整体往后移动一个位置
//然后再将那个元素放到那个位置上面,最后,把整个链表的长度加1.
template <class T>
LinkList<T>& LinkList<T>::Insert(int k, const T& x){
    if (k<0 || k>length) {
        throw OutOfBounds();
    }
    if (length==MaxSize) {
        throw Nomen();
    }
    for (int i=length-1; i>=k; i++) {
        element[i+1]=element[i];
        
    }
    element[k]=x;
    length++;
    return *this;
}


//测试
int main(int argc, const char * argv[]) {
    int x=0;
    LinkList<int> linklist(10);
    std::cout<<"链表为空吗?"<<linklist.isEmpty()<<std::endl;
    std::cout<<"链表长度为"<<linklist.Length()<<std::endl;

    linklist.Insert(0, 2);
    linklist.Insert(1, 3);
    std::cout<<"链表长度为"<<linklist.Length()<<std::endl;
    linklist.Delete(1, x);
    std::cout<<"链表长度为"<<linklist.Length()<<std::endl;
    std::cout<<linklist.Search(2)<<std::endl;
    return 0;
<p>}</p>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">第一次写博客,以后还会陆陆续续写下去(ps:小海豹带出来的孩子要好好写博客!</span><img alt="微笑" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif" style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);" /><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">)</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值