单链表的实现

数据结构书上例子

 

//List.h

#include<iostream>
#include <fstream>
using namespace std;

template <class T>
struct LinkNode{
    T data;
    LinkNode<T> *link;
    LinkNode<T> (LinkNode<T> *ptr=NULL)
    {link=ptr;}
    LinkNode<T> (const T& item,LinkNode<T> *ptr=NULL)
    { data=item;link=ptr;}
};

template <class T>
class List{
public:
    List()      //初始化
    {first=new LinkNode<T>;}
    List(const T& x){first = new LinkNode<T>(x);}
    List(List<T> &L);
    ~List(){makeEmpty();}
    void makeEmpty();    //置空
    LinkNode<T>* getHead() const {return first;}    
    LinkNode<T> *Search(T x);          //查找x
    LinkNode<T> *Locate(int i);         //寻找第i个节点
    bool getData(int i, T & x);            //第i个节点的值赋给x
    bool Insert(int i, T& x);                //第i个位置插入i
    bool IsEmpty()const
    {return first->link==NULL?true:false;}
    bool Sort();                                //排序
    bool  input();                                //输入数据
    List<T> &operator=(List<T> &L);     //重载=
    friend ostream& operator << <T> (ostream& out,List<T> &L);   //重载<<
    friend istream&operator >> (istream&in,List<T> &L)
    {
        LinkNode<T> *p,*q;
        T a;
        L.makeEmpty();
        p=L.getHead();
        while(!in.eof())
        {
            in>>a;
            q=new LinkNode<T>(a);
            p->link=q;
            p=q;
        }
        p->link=NULL;
        return in;
    }            //重载>>
protected:
    LinkNode<T> *first;
};

template<class T>
ostream& operator << (ostream& out,List<T> &L)
{
        LinkNode<T> *q=L.first->link;
        while(q!=NULL)
        {
            out<<q->data<<endl;
            q=q->link;
        }
        return out;
};

template <class T>
List<T>::List(List<T> &L){
    T value;
    LinkNode<T> *stcptr=L.getHead();
    LinkNode<T> *destptr=first=new LinkNode<T>;
    while(stcptr->link!=NULL){
        value=stcptr->link->data;
        destptr->link=new LinkNode<T>(value);
        destptr=destptr->link;
        stcptr=stcptr->link;
    }
    destptr->link=NULL;
};

template<class T>
void List<T>::makeEmpty(){
    LinkNode<T> *q;
    while(first->link!=NULL){
        q=first->link;
        first->link=q->link;
        delete q;
    }
};

template<class T>
LinkNode<T>* List<T>::Search(T x){
    LinkNode<T> *current=first->link;
    while(current!=NULL){
        if(current->data==x) break;
        else
            current=current->link;
    }
    return current;
};

template<class T>
LinkNode<T>* List<T>::Locate(int i){
    if(i<0)
        return NULL;
    LinkNode<T>* current=first;
    int k=0;
    while(current!=NULL&&k<i)
    {
        current=current->link;
        k++;
    }
    return current;
};

//取出链表第i个元素值
template<class T>
bool List<T>::getData(int i, T&x)
{
    if(i<=0)
        return false;
    LinkNode<T>*current=Locate(i);
    if(current==NULL)
        return false;
    else
    {
        x=current->data;
        return true;
    }
};

template <class T>
bool List<T>::Insert(int i,T&x)
{
    LinkNode<T>*current=Locate(i);
    if(current==NULL)
        return false;
    LinkNode<T> *newnode=new LinkNode<T>(x);
    if (newnode==NULL)
    {
        cout<<"error"<<endl;
        return false;
    }
    newnode->link=current->link;
    current->link=newnode;
    return true;
};

template<class T>
List<T>&  List<T>::operator=(List<T>& L){
    T value;
    LinkNode<T> *srcptr =L.getHead();
    LinkNode<T>*destptr=first=new LinkNode<T>;
    while(srcptr->link!=NULL)
    {
        value=srcptr->link->data;
        destptr->link=new LinkNode<T>(value);
        destptr=destptr->link;
        srcptr=srcptr->link;
    }
    destptr->link=NULL;
    return *this;
};

template<class T>
bool List<T>::Sort()
{
    LinkNode<T> *q;
    LinkNode<T> *p=first;
    T  x1,x2;
    int N=0;
    while(p->link!=NULL)
    {
        N++;
        p=p->link;
    }
    while (N==1)
    {
        cout<<"the list is kongde"<<endl;
        return false;
    }
    for(int i=1;i<N;i++)
    {
        for (int j=N;j>i;j--)
        {
            getData(j-1,x1);
            getData(j,x2);    
            if(x1>x2)
            {
                p=Locate(j-1);
                q=Locate(j);
                p->data=x2;
                q->data=x1;
            }
        }
    }
};

template<class T>
bool List<T>::input()
{
    T x;
    LinkNode<T >*current=getHead();
    cout<<"输入数据(以0结束)"<<endl;
    cin>>x;
    while(x!=0){
        LinkNode<T> *node=new LinkNode<T>(x);
        node->link=current->link;
        current->link=node;
        cin>>x;
    }
    return true;
}


//main.cpp

#include<iostream>
#include <fstream>
#include"List.h"
using namespace std;

int main()
{
    List<int> list;
    int x;
    int i;
    cout<<"测试输入"<<endl;
    list.input();
    cout<<"链表如下"<<endl;
    cout<<list<<endl;
    cout << "=======================\n";
    
    cout<<"输入插入的位置和数据"<<endl;
    cin>>i;
    cin>>x;
    if(!list.Insert(i,x))
        cout<<"插入失败"<<endl;
    cout<<"链表如下:"<<endl;
    cout<<list<<endl;
    cout << "=======================\n";
    cout<<"测试复制链表"<<endl;
    List<int> list1(list);
    cout<<"链表如下:"<<endl;
    cout<<list1;
    cout << "=======================\n";
    cout<<"测试查找"<<endl;
    cout<<"search i"<<endl;
    cin>>i;
    LinkNode<int> *current=list.Search(i);
    if (!current)
    {
        cout<<"不存在"<<endl;
    }
    else
    {
        cout<<"输入要修改的值"<<endl;
        cin>>i;
        current->data=i;
    }
    cout<<"链表如下:"<<endl;
    cout<<list;
    cout << "=======================\n";
    cout<<"测试从文本读取"<<endl;
    List<int>  list2;
    ifstream sin("data.txt");
/*
    cout<<"输入文件名和路径"<<endl;
    char filename[60];
    cin.getline(filename,60);
    ifstream sin;
    inFile.open(filename);
    if(!sin.is_open())
    {
        cout<<"can not open the file"<<filename<<endl;
        return -1;
    }
*/
    sin>>list2;
    cout<<"链表如下:"<<endl;
    cout<<list2<<endl;
    sin.close();
    cout << "=======================\n";
    list2.Sort();
    cout<<"排序后的链表如下:"<<endl;
    cout<<list2<<endl;
    cout << "=======================\n";
    
    return 0;
}


//main.cpp  测试代码

#include<iostream>
#include <fstream>
#include"List.h"
using namespace std;

int main()
{
    cout<<"测试从文本读取"<<endl;   
    List<int>  list2;
    cout<<"输入文件名和路径"<<endl;
    char filename[60];
    cin.getline(filename,60);
    ifstream sin;
    sin.open(filename);
    if(!sin.is_open())
    {
        cout<<"文件无法打开"<<filename<<endl;
        return -1;
    }
    sin>>list2;
    cout<<"链表如下:"<<endl;
    cout<<list2<<endl;
    cout << "=======================\n";
    list2.Sort();
    cout<<"排序后的链表如下:"<<endl;
    cout<<list2<<endl;
    cout << "=======================\n";
    sin.close();

    List<int> list;
    int x;
    int i;
    cout<<"测试输入"<<endl;
    list.input();
    cout<<"链表如下"<<endl;
    cout<<list<<endl;
    cout << "=======================\n";
    
    cout<<"输入插入的位置和数据"<<endl;
    cin>>i;
    cin>>x;
    if(!list.Insert(i,x))
        cout<<"插入失败"<<endl;
    cout<<"链表如下:"<<endl;
    cout<<list<<endl;
    cout << "=======================\n";
    cout<<"测试复制链表"<<endl;
    List<int> list1(list);
    cout<<"链表如下:"<<endl;
    cout<<list1;
    cout << "=======================\n";
    cout<<"测试查找"<<endl;
    cout<<"search i"<<endl;
    cin>>i;
    LinkNode<int> *current=list.Search(i);
    if (!current)
    {
        cout<<"不存在"<<endl;
    }
    else
    {
        cout<<"输入要修改的值"<<endl;
        cin>>i;
        current->data=i;
    }
    cout<<"链表如下:"<<endl;
    cout<<list;
    cout << "=======================\n";   

    return 0;
}
View Code

 

posted @ 2013-11-17 00:19  兔子爱吃小白菜  阅读(159)  评论(0编辑  收藏  举报