C++ 数据结构与算法(二)线性表之单链表

C++ 数据结构与算法(二)线性表之单链表:写的不足之处,望指教:)。

ListNode.h:

 

template<typename Type> class SingleList;

template<typename T>
class ListNode
{//链表结点类
public:

    ListNode():m_pnext(NULL)
    {

    }
    ListNode(const T item,ListNode<T>* next= NULL):m_data(item),m_pnext(next)
    {

    }
    ~ListNode()
    {
        m_pnext = NULL;
    }
public:
    T GetData();
    friend typename SingleList<T>;
private:
    T m_data;//存放结点值的数据域
    ListNode* m_pnext;//存放结点的直接后继的地址(位置)的指针域(链域)
};
template<typename T>
T ListNode<T>::GetData()
{
    return this->m_data;
}

 

 

 

SingleList.h:

 

#include "ListNode.h"


template<typename T> 
class SingleList
{
public:
    SingleList()
    {
        head = new ListNode<T>();
    }
    ~SingleList()
    {
        EmptyList();
        delete head;
    }
    
public:
    void EmptyList();//清空链表
    int Length();//获得链表长度
    
    ListNode<T>* Find(int n);//查找第n个结点
    bool Insert(T data,int n);//插入到链表的第n个位置
    T Delete(int n);//删除第n个数据
    
    T GetData(int n);//获取第n个数据
    void Print();
    
private:
    ListNode<T>* head;
};
template<typename T>
void SingleList<T>::EmptyList()
{
    ListNode<T>* pdel;
    while(head->m_pnext != NULL)
    {
        pdel = head->m_pnext;
        head->m_pnext = pdel->m_pnext;
        delete pdel;
    }
}
template<typename T>
int SingleList<T>::Length()
{
    ListNode<T>* p = head->m_pnext;
    int count = 0;
    while(p != NULL)
    {
        count ++;
        p = p->m_pnext;
    }
    return count;
}

template<typename T>
ListNode<T>* SingleList<T>::Find(int n)
{
    if(n < 1)
    {
        cout << " 非法操作" << endl;
        return NULL;
     }
    ListNode<T>* p = head->m_pnext;
    for(int i = 0 ;i < n&&p; i ++)
    {
        p = p->m_pnext;
    }
    if(p == NULL)
    {
        cout << "n值 益处" << endl;
        return NULL;
    }
    return p;

}
template<typename T>
bool SingleList<T>::Insert(T data, int n)
{
    if(n < 0 || n > Length())
    {
        cout <<"n 值 非法" << endl;
        return false;
    }
    ListNode<T>* p = head;
    ListNode<T>* pnewnode = new ListNode<T>(data,NULL);
    if(pnewnode == NULL)
    {
        cout << "创建新结点失败" << endl;
        return false;
    }
    for(int i= 0 ;i < n &&p; i ++)
    {
        p = p->m_pnext;
    }
    if(p == NULL)
    {
        cout << "n 值非法" <<endl;
        return false;
    }
    pnewnode->m_pnext = p->m_pnext;
    p->m_pnext = pnewnode;
    return true;

}
template<typename T>
T SingleList<T>::Delete(int n)
{
    if(n < 0 || n > this->Length())
    {
        cout <<"n值非法" << endl;
        return NULL;
    }
    ListNode<T>* p = head; 
    ListNode<T>* pdel;
    for(int i =0 ;i< n&& p->m_pnext;i ++)
    {
        p = p->m_pnext;
    }
    if(p->m_pnext == NULL)
    {
        cout << "没有找到" << endl;
        return NULL;
    }
    pdel = p->m_pnext;
    p->m_pnext = pdel->m_pnext;
    T data = pdel->m_data;
    delete pdel;
    return data;
}
template<typename T>
T SingleList<T>::GetData(int n)
{
    if(n < 0 || n > this->Length())
    {
        cout <<"n值非法" << endl;
        return NULL;
    }
    ListNode<T>* p = head->m_pnext;
    for(int i =0 ;i <n&& p; i++)
    {
        p = p->m_pnext;
    }
    if(NULL == p)
    {
        cout <<"n值非法" << endl;
        return NULL;
    }
    return p->m_data;
}
template<typename T>
void SingleList<T>::Print()
{
    ListNode<T>* p  = head->m_pnext;
    cout << "head";
    while(p)
    {
        cout << "-->" << p->m_data;
        p = p->m_pnext;
    }
    cout << "-->over" <<endl;

}

 

 

 

test.cpp:

 

// test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "SingleList.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    SingleList<int> singlelist;
    
    for(int i = 0;i<15; i++)
    {
        singlelist.Insert(i*3,i);
    }
    singlelist.Print();
    singlelist.Delete(1);
    singlelist.Print();
    cout <<     singlelist.Length();
    cin.get();
    return 0;
}

 

测试结果:

 

posted @ 2013-03-24 16:35  Jamy Cai  阅读(484)  评论(0编辑  收藏  举报