| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1261 人关注过本帖
标题:求助数据结构编程
只看楼主 加入收藏
huyizhu
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2008-8-29
结帖率:100%
收藏
 问题点数:0 回复次数:8 
求助数据结构编程
我是一个数据结构的初学者,关于线性表的基本运算只是懂理论,那位高人能帮我编一个具体的程序让我具体了解一下呢。
要求是:构造链表数据结构,并实现创建,插入,删除,定位,清空,求表长,按值查找等功能。
谢谢了啊。
搜索更多相关主题的帖子: 数据结构 
2008-09-25 15:52
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
既然是学习数据结构为什么不自己亲手编写呢?
你只有亲自编写才体会深刻,光看是不行的...
2008-09-25 17:17
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
这是写的基于顺序表的代码,供你参考:
#ifndef SEQLIST_H
#define SEQLIST_H

#include<iostream.h>
#include<stdlib.h>
//#include"LinearList.h"
const int defaultSize=100;

/////////////////////////////////////////////////////////////
//SeqList类模板(从LinearList抽象基类模板继承)
/////////////////////////////////////////////////////////////
template<class T>
class SeqList//:public LinearList<T>
{
protected:
    //动态数组的首指针
    T* data;
    //最大可容纳表项的数目
    int maxSize;
    //当前已存表项的最后位置
    int last;
    //改变数组空间大小
void reSize(int newSize);
public:
    //构造函数
    SeqList(int sz=maxSize);
    //复制构造函数
    SeqList(SeqList<T>& L);
    //析构函数
    ~SeqList()
    {
        //cout<<"用完回收内存!"<<endl;
        delete [] data;
        cout<<"顺序表内存释放完毕!"<<endl;
    };
    //得到表最大可容纳的元素个数
    int Size()const
    {
        return maxSize;
    };
    //计算表的长度
    int Length()const
    {
        return last+1;
    };
    //搜索x在表中的位置,返回表项序号
    int Search(T& x)const;
    //定位第i个表项,返回表项序号
    int Locate(int i)const;
    //取第i个表项的值
    T* getData(int i)const
    {
        if((i>0)&&(i<=last+1))
        {
            return &data[i-1];
        }
        else
        {
            return NULL;
        }
    };
    //用x修改第i个表项的值
    void setData(int i,T& x)
    {
        if((i>0)&&(i<=last+1))
            data[i-1]=x;
    };
    //把x插入到第i个表项之后
    bool Insert(int i,T& x);
    //删除第i个表项,通过x返回表项的值
    bool Remove(int i,T& x);
    //判断表是否为空
    bool IsEmpty()const
    {
        if(last==-1)
            return true;
        else
            return false;
    };
    //判断表是否为满
    bool IsFull()const
    {
        if(last==maxSize-1)
            return true;
        else
            return false;
    };
    //表项的输入
    void input();
    //表项的输出
    void output();
    //重载赋值运算符
    SeqList<T> operator=(SeqList<T>& L);
    //排序函数
    void Sort();
    //调用私有的改变存储空间的reSize()函数
    void runreSize(int newSize);
};
/////////////////////////////////////////////////////////////
//构造函数SeqList()
/////////////////////////////////////////////////////////////
template<class T>
SeqList<T>::SeqList(int sz)
{
    //通过指定参数来设置数组长度
    maxSize=sz;
    //把数组置为空
    last=-1;
    //为数组开辟内存空间
    data=new T[maxSize];
    //如果动态内存分配失败
    if(data==NULL)
    {
        cerr<<"内存分配出错!"<<endl;
        exit(1);
    };
};
////////////////////////////////////////////SeqList()函数结束

/////////////////////////////////////////////////////////////
//复制构造函数SeqList()
/////////////////////////////////////////////////////////////
template<class T>
SeqList<T>::SeqList(SeqList<T>& L)
{
    //用已有的顺序表来初始化新的顺序表
    maxSize=L.Size();
    last=L.Length()-1;
    data=new T[maxSize];
    //动态内存分配失败
    if(data==NULL)
    {
        cerr<<"存储分配错误!"<<endl;
        exit(1);
    }
    //元素的拷贝
    for(int i=1;i<=last+1;i++)
    {
        data[i-1]=*L.getData(i);
    }
};
////////////////////////////////////////SeqList()复制构造结束

/////////////////////////////////////////////////////////////
//Search(T& x)函数
/////////////////////////////////////////////////////////////
template<class T>
int SeqList<T>::Search(T& x)const
{
    int p=0;
    for(p=0;p<=last;p++)
    {
        //顺序搜索
        if(data[p]==x)
            return p+1;
    }
    //搜索失败
    return 0;
};
/////////////////////////////////////////Search(T& x)函数结束

/////////////////////////////////////////////////////////////
//Locate()定位函数
/////////////////////////////////////////////////////////////
template<class T>
int SeqList<T>::Locate(int i)const
{
    //在顺序表中只要把i原样返回
    if(i>=1&&i<=last+1)
        return i;
    else
        return 0;
};
/////////////////////////////////////////////Locate()函数结束

/////////////////////////////////////////////////////////////
//Insert()函数
/////////////////////////////////////////////////////////////
template<class T>
bool SeqList<T>::Insert(int i,T& x)
{
    //在第i个元素的后面插入x

    //满了则无法插入
    if(last==(maxSize-1))
        return false;
    //输入的表项号超出范围
    if(i<0||i>last+1)
        return false;
    
    //把第i个元素向后挪腾出一个位置
    for(int j=last;j>=i;j--)
    {
        data[j+1]=data[j];
    }

    //在腾空的位置上插入x
    data[i]=x;

    //顺序表长度加1
    last++;

    return true;
};
/////////////////////////////////////////////////Locate()结束

/////////////////////////////////////////////////////////////
//Remove()
/////////////////////////////////////////////////////////////
template<class T>
bool SeqList<T>::Remove(int i,T& x)
{
    //空则删除失败
    if(last==-1)
        return false;
    if(i<1||i>(last+1))
        return false;
    //如果只剩下最后一个元素,则删除
    //last变为-1;
    if(last==0)
    {
        last--;
        return true;
    };
    
    //先把要删除的第i个表项用x返回
    x=data[i-1];

    //从第i+1个表项往后,一个一个依次往前覆盖
    for(int j=i;j<=last;j++)
        data[j-1]=data[j];

    //最后一个元素的位置向前推一格
    last--;

    //删除成功
    return true;
};
/////////////////////////////////////////////Remove()函数结束

/////////////////////////////////////////////////////////////
//intput()函数
/////////////////////////////////////////////////////////////
template<class T>
void SeqList<T>::input()
{
    //从键盘输入表项
    cout<<"开始建立顺序表,请输入表中的元素个数:";
    while(1)
    {
        //输入元素的最后位置
        int n;
        cin>>n;
        last=n-1;
        if(last<=maxSize-1) break;
        cout<<"元素个数已经超出了范围"<<maxSize-1<<"了:";
    }
    for(int i=0;i<=last;i++)
    {
        //逐个输入元素
        cout<<"请输入第"<<i+1<<"个元素:";
        cin>>data[i];
        cout<<endl;
    };
};
//////////////////////////////////////////////input()函数结束

/////////////////////////////////////////////////////////////
//output()函数
/////////////////////////////////////////////////////////////
template<class T>
void SeqList<T>::output()
{
    //将顺序表全部元素输出到屏幕上
    cout<<"顺序表当前元素最后位置为:"<<last<<endl;
    for(int i=0;i<=last;i++)
        cout<<"#"<<i+1<<":"<<data[i]<<endl;
};
/////////////////////////////////////////////output()函数结束

/////////////////////////////////////////////////////////////
//重载赋值运算符
/////////////////////////////////////
template<class T>
SeqList<T> SeqList<T>::operator=(SeqList<T>& L)
{
    //最后一个表项位置的拷贝
    last=L.last;

    //表项的拷贝
    for(int i=1;i<=L.Length();i++)
        data[i-1]=(*L.getData(i));

    //返回当前类模板的地址对应的内容
    return (*this);
};
/////////////////////////////////////////////////////重载结束

/////////////////////////////////////////////////////////////
//reSize()函数
/////////////////////////////////////////////////////////////
template<class T>
void SeqList<T>::reSize(int newSize)
{
    //私有函数:重新改变顺序表的存储数组的空间的大小
    //新数组的元素个数为newSize
    
    if(newSize<=maxSize)
    {
        cerr<<"无效的数组的大小,或者现有的空间已经够用不需要扩充!"<<endl;
        return;
    };
    
    //修改存储数组的空间大小
    if(newSize>maxSize)
    {
        //重新分配一段新的内存空间
        T* newarray=new T[newSize];
        
        //如果分配失败的话
        /*if(newarray=0)
        {
            cerr<<"堆内存分配失败!"<<endl;
            exit(1);
        }*/
        
        //把旧数组的内容复制到新数组中去

        //旧数组的首地址
        T* srcptr=data;
        //新数组首地址
        T* destptr=newarray;
        //得到旧数组的元素个数
        int n=last+1;
        
        while(n--)
        {
            cout<<*srcptr<<" ";
            *newarray++=*srcptr++;
        }
        //删除旧数组所占用的内存空间
       
        delete [] data;
        //把新的数组首地址给data
        data=newarray;
        //修改maxSize的值
        maxSize=newSize;
    };
};
/////////////////////////////////////////////reSize()函数结束

/////////////////////////////////////////////////////////////
//Sort()排序函数
/////////////////////////////////////////////////////////////
template<class T>
void SeqList<T>::Sort()
{
    int k;//用于存放当前最小的数的标号
    for(int i=0;i<=last;i++)
    {
        k=i;
        //找从i+1到n-1之间最小的数
        for(int j=i+1;j<=last;j++)
        {
            if(data[k]>data[j])
                k=j;
        }
        //交换data[k]和data[i]分别对应的元素
        T temp;//中间变量
        if(i!=k)
        {
            temp=data[i];
            data[i]=data[k];
            data[k]=temp;
        };
    };
    cout<<"排序完毕!"<<endl;
};
///////////////////////////////////////////////Sort()函数结束

/////////////////////////////////////////////////////////////
//runreSize()调用私有的reSize()函数
/////////////////////////////////////////////////////////////
template<class T>
void SeqList<T>::runreSize(int newSize)
{
    reSize(newSize);
};
//////////////////////////////////////////////runreSize()结束

#endif
2008-09-25 21:43
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
写这个代码要注意的是判空和判满,以及插入和删除,其他没什么难的了.
2008-09-25 21:45
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
这是基于链表的线性表:
#ifndef LINKED_LIST
#define LINKED_LIST

#include<iostream.h>
#include<stdlib.h>
#include<assert.h>

//////////////////////////////////////////////////////////
//链表结点结构LinkNode的定义
//////////////////////////////////////////////////////////
template <class T>
struct LinkNode
{
    //数据域
    T data;
    //指针域
    LinkNode<T>* link;
    //本结点的访问次数
    int fre;
    //结点构造函数,只用指针初始化
    LinkNode(LinkNode<T>* ptr=NULL)
    {
        //用参数初始化
        link=ptr;
    };
    //结点构造函数,用数据和指针初始化
    LinkNode(const T& item,LinkNode<T>* ptr=NULL)
    {
        //初始化数据
        data=item;
        //初始化指针
        link=ptr;
        //访问次数
        fre=0;
    };    
};
//////////////////////////////////////////LinkNode结构结束

//////////////////////////////////////////////////////////
//链表类List的定义
//////////////////////////////////////////////////////////
template<class T>
class List//:public LinearList<T>
{
protected:
    LinkNode<T>* first;
public:
    //构造函数
    List()
    {
        //初始化头指针,并自动调用
        //结点的构造函数
        first=new LinkNode<T>;
    };
    //构造函数
    List(const T& x)
    {
        //动态分配一个带参数的结点
        first=new LinkNode<T>(x);
    };
    //复制构造函数
    List(List<T>& L);
    //析构函数
    ~List()
    {
        //即释放链表所占用的所有内存
        //链表游标
        LinkNode<T>* ptr=first;
        //指向要删除的结点
        LinkNode<T>* del;
        while(ptr!=NULL)
        {
            del=ptr;
            ptr=ptr->link;
            delete del;
        }
        //cout<<"链表的内存已经完全释放!"<<endl;
    };
    LinkNode<T>* getHead()const
    {
        return first;
    };
    //将链表置空
    void makeEmpty();
    //得到链表的长度
    int Length()const;
    //得到链表的尾部的结点
    LinkNode<T>* getRear(LinkNode<T>*);
    //设置附加头结点的地址
    void setHead(LinkNode<T>* p)
    {first=p;};
    //搜索含数据元素x的结点,返回接指针
    LinkNode<T>* Search(T x);
    //用递归的方法搜索具有值x的结点指针
    LinkNode<T>* search(LinkNode<T>*,T x);
    //定位函数
    LinkNode<T>* Locate(int i);
    //获取指定位置上的数据
    T* getData(int i);
    //用x来修改第i个元素上的值
    void setData(int i,T& x);
    //在第i个元素后插入元素x
    bool Insert(int i,T& x);
    //删除第i个元素,并通过x返回被删除的值
    bool Remove(int i,T& x);
    //判断链表是否为空
    bool IsEmpty()const
    {
        if(first->link==NULL)
            return true;
        else
            return false;
    };
    //判断链表是否为满
    bool IsFull()const
    {
        //链表的长度不受限制
        return false;
    };
    //链表元素的输出
    void output();
    //从头部插入元素建立链表
    void inputFront(T);
    //从尾部插入元素建立链表
    void inputRear(T);
    //重载赋值运算符
    LinkNode<T>& operator=(LinkNode<T>& L);
    //把链表中的所有指针逆转
    void reverseList();
    //把已经地址的结点挂入当前链表的尾部
    void hangRear(LinkNode<T>* ptr);
    //字符数据的分离
    void charSelect(List<T>&,List<T>&,List<T>&);
    //删除介于[min,max]区间上的元素
    void removeList(T,T);
    //取得已经指针指向的结点的序号
    int getNo(LinkNode<T>*);
    //依次显示每个结点的访问次数
    void displayFre();
    //按照访问的次数fre对链表中的结点排序(从大到小)
    void SortFre();
    //通过堆栈来逆转链表的所有结点
    void revList();
};
////////////////////////////////////////List链表类声明结束

//////////////////////////////////////////////////////////
//List()复制构造函数
//////////////////////////////////////////////////////////
template<class T>
List<T>::List(List<T>& L)
{
    //用于存放要复制的值
    T value;
    //指向新结点
    LinkNode<T>* newNode;
    //新建一个附加头结点
    first=new LinkNode<T>(0);
    if(first==NULL)
    {
        cerr<<"内存分配失败!"<<endl;
        exit(1);
    };

    //复制每个元素的内容,得到被复制链表的附加头结点地址
    LinkNode<T>* srcptr=L.getHead();  //源链表
    LinkNode<T>* destptr=first;       //目的链表

    //逐个结点复制
    while(srcptr!=NULL)
    {
        //从附加头结点后的那个结点开始
        //取出源链表的数据,放入value
        value=srcptr->data;
        //创建一个新结点,用value初始化,并以游标指向它
        newNode=new LinkNode<T>(value);
        //把新结点挂到目的结点的尾部
        destptr->link=newNode;

        //目的链表指针往后推进一格
        destptr=newNode;
        //源链表指针往后推进一格
        srcptr=srcptr->link;
    };
    destptr->link=NULL;
};
/////////////////////////////////////////复制构造函数结束

/////////////////////////////////////////////////////////
//将链表置空的makeEmpty()函数
/////////////////////////////////////////////////////////
template<class T>
void List<T>::makeEmpty()
{
    //一个结点指针
    LinkNode<T>* q;

    //当链表不为空时,删去所有数据结点
    while(first->link!=NULL)
    {
        //获得第一个数据结点地址
        q=first->link;
        //摘下第一个数据结点
        first->link=q->link;
        //删除摘下的结点
        delete q;
    };
};
//////////////////////////////////////makeEmpty()函数结束

/////////////////////////////////////////////////////////
//计算链表的长度Length()函数
/////////////////////////////////////////////////////////
template<class T>
int List<T>::Length()const
{
    //链表游标,指向第一个数据结点
    LinkNode<T>* ptr=first->link;
    //计数器
    int count=0;
    //扫描链表所有结点
    while(ptr!=NULL)
    {
        count++;
        //指针向后推一格
        ptr=ptr->link;
    }
    return count;
};
/////////////////////////////////////////Length()函数结束

/////////////////////////////////////////////////////////
//getRear()函数 得到链表的尾指针
/////////////////////////////////////////////////////////
template<class T>
LinkNode<T>* List<T>::getRear(LinkNode<T>* ptr)
{
    
    if(ptr==NULL)
        //如果链表为空
        return NULL;
    else
        //递归结束条件
        if(ptr->link==NULL)
            return ptr;
    else
        //递归的过程
        return getRear(ptr->link);
};
////////////////////////////////////////getRear()函数结束

/////////////////////////////////////////////////////////
//Search()函数
/////////////////////////////////////////////////////////
template<class T>
LinkNode<T>* List<T>::Search(T x)
{
    //定义一个链表游标
    LinkNode<T>* ptr=first->link;
    while(ptr!=NULL)
    {
        //匹配
        if(ptr->data==x)
            break;
        else
            //游标向后推进一格
            ptr=ptr->link;
    };
    //返回指针,如果没找到ptr自动为空
    return ptr;
};
///////////////////Search()函数结束


/////////////////////////////////////////////////////////
//search()函数 以递归的方法
//搜索具有值x的结点指针
/////////////////////////////////////////////////////////
template<class T>
LinkNode<T>* List<T>::search(LinkNode<T>* f,T x)
{
    if(f==NULL)
    {
        //如果链表为空
        cout<<"链表为空!"<<endl;
        return NULL;
    }
    else if(f->link==NULL)
    {
        //没有找到停止递归
        cout<<"没有找到!"<<endl;
        return NULL;
    }
    else if(f->data==x)
        return f;
    else
    {
        return search(f->link,x);
    };
};
/////////////////////////////////////////search()函数结束

/////////////////////////////////////////////////////////
//Locate()函数
/////////////////////////////////////////////////////////
template<class T>
LinkNode<T>* List<T>::Locate(int i)
{
    //定义一个链表游标
    LinkNode<T>* ptr=first;
    //如果i<0或者超出链表长度,则返回NULL
    //用this指针指代当前对象
    //i=0表示指向附加头结点
    if(i<0||i>this->Length())
        return NULL;
    for(int x=1;x<=i;x++)
    {
        //游标向后推进一格
        ptr=ptr->link;
    }
    //访问次数加一
    ptr->fre++;
    //把访问次数多的结点望头结点的位置调整
   
    return ptr;
};
/////////////////////////////////////////Locate()函数结束

/////////////////////////////////////////////////////////
//getData()函数
/////////////////////////////////////////////////////////
template<class T>
T* List<T>::getData(int i)
{
    //i越界的情形,第0个结点不含数据,不含在内
    if(i<=0||i>Length())
        return NULL;
    //不越界
    LinkNode<T>* ptr=Locate(i);
    if(ptr==NULL)
        return NULL;
    else
        //返回数据域的地址
        return &ptr->data;
};
////////////////////////////////////////getData()函数结束

/////////////////////////////////////////////////////////
//setData()函数
/////////////////////////////////////////////////////////
template<class T>
void List<T>::setData(int i,T& x)
{
    //第0个结点数据不能修改,所以不含在内
    if(i<=0||i>Length())
        return;
    //指向要修改的结点
    LinkNode<T>* current=Locate(i);
    if(current==NULL)
        return;
    else
        current->data=x;
};
////////////////////////////////////////////setData()函数

/////////////////////////////////////////////////////////
//Insert()函数
/////////////////////////////////////////////////////////
template<class T>
bool List<T>::Insert(int i,T& x)
{
    //将新元素x插入在第i个元素之后
    //指向要插入元素前一个结点的指针
    LinkNode<T>* current=Locate(i);
    //定位不成功
    if(current==NULL)
        return false;
    //为新数据创建一个新结点
    LinkNode<T>* newNode=new LinkNode<T>(x);
    if(newNode==NULL)
    {
        cerr<<"内存分配失败!"<<endl;
        exit(1);
    }
    //以下执行插入操作
    newNode->link=current->link;
    current->link=newNode;
    
    //插入成功
    return true;
};
/////////////////////////////////////////Insert()函数结束

/////////////////////////////////////////////////////////
//Remove()函数
/////////////////////////////////////////////////////////
template<class T>
bool List<T>::Remove(int i,T& x)
{
    //越界处理
    if(i<=0||i>Length())
        return false;
    //得到一个要删除结点的前一个结点的指针
    LinkNode<T>* current=Locate(i-1);
    //删除失败
    if(current==NULL||current->link==NULL)
        return false;
    //del用于指向被摘下的结点
    LinkNode<T>* del=current->link;
    current->link=del->link;
    x=del->data;
    delete del;

    //删除成功
    return true;
};
/////////////////////////////////////////Remove()函数结束

/////////////////////////////////////////////////////////
//output()函数
/////////////////////////////////////////////////////////
template<class T>
void List<T>::output()
{
    //定义游标
    LinkNode<T>* current=first->link;
    if(current==NULL)
    {
        cout<<"链表为空!"<<endl;
        return;
    }
    else
    {
        while(current!=NULL)
        {
            //依次显示每个结点数据域的内容
            cout<<current->data<<" ";
            current=current->link;
        }
    }
};
/////////////////////////////////////////output()函数结束

/////////////////////////////////////////////////////////
//重载赋值运算符
/////////////////////////////////////////////////////////
template<class T>
LinkNode<T>& List<T>::operator =(LinkNode<T>& L)
{
    //把对象参数L复制到当前对象中去
    T value;

    //得到源串首地址和新建目的串指针
    LinkNode<T>* srcptr=L.getHead();
    LinkNode<T>* destptr=first=new LinkNode<T>;

    //逐个结点复制
    while(srcptr!=NULL)
    {
        //得到原串结点的数据
        value=src->link->data;
        //新建一个结点,并value初始化
        destptr->link=new LinkNode<T>(value);
        //目的串和源串指针分别向后推进一格
        srcptr=srcptr->link;
        destptr=destptr->link;
    };
    destptr->link=NULL;
    //返回当前对象的引用
    return *this;
};
/////////////////////////////////////////////////重载结束

/////////////////////////////////////////////////////////
//inputFront()函数
/////////////////////////////////////////////////////////
template<class T>
void List<T>::inputFront(T endTag)
{
    //endTag为结束符号

    //新结点的指针
    LinkNode<T>* newNode;
    //要插入的值
    T val;
    //新建一个附加头结点
    //first->link默认为NULL
    //其实在链表结点的构造函数已经分配过了
    
    //以下代码如果加上则只能新建链表而不能追加元素
    /*first=new LinkNode<T>;
    if(first==NULL)
    {
        cerr<<"内存分配出错!"<<endl;
        exit(1);
    };*/
    //输入值
    cout<<"请输入链表的的数据内容:"<<endl;
    cin>>val;
    while(val!=endTag)
    {
        //创建新结点
        newNode=new LinkNode<T>(val);
        if(newNode==NULL)
        {
            cerr<<"内存分配出错!"<<endl;
            exit(1);
        };
        //把新结点插入到链表的头部
        newNode->link=first->link;
        first->link=newNode;
        //输入下一个结点的数据值
        cin>>val;
    };
};
//////////////////////////////////////////input()函数结束

/////////////////////////////////////////////////////////
//inputRear()函数
/////////////////////////////////////////////////////////
template<class T>
void List<T>::inputRear(T endTag)
{
    //新结点的指针
    LinkNode<T>* newNode;
    //指向链表尾部的指针
    LinkNode<T>* last;
    //要插入的值
    T val;
    
    //新建一个附加头结点
    //以下代码如果加上则只能新建链表而不能追加元素
    /*first=new  LinkNode<T>;
    if(first==NULL)
    {
        cerr<<"内存分配出错!"<<endl;
        exit(1);
    };*/
    cout<<"请输入链表的数据内容:"<<endl;
    cin>>val;
    //让last指向链表的最后一个结点
    last=first;
    while(last->link!=NULL)
    {
        //指针向后推进一格
        last=last->link;
    };
    while(val!=endTag)
    {
        //新建一个结点,让newNode指向它
        //用val值进行初始化
        newNode=new LinkNode<T>(val);
        if(newNode==NULL)
        {
            cerr<<"内存分配出错!"<<endl;
            exit(1);
        };
        //把新建的结点插入到链表的尾部
        last->link=newNode;
        last=newNode;
        //输入下个结点的数据
        cin>>val;
    };
    //把最后一个结点的指针置为空
    last->link=NULL;
};
//////////////////////////////////////inputRear()函数结束

/////////////////////////////////////////////////////////
//reverseList()函数
//逆转单链表
/////////////////////////////////////////////////////////
template<class T>
void List<T>::reverseList()
{
    if(first==NULL)
    {
        cout<<"链表为空!"<<endl;
        exit(1);
    };
    if(first->link==NULL)
    {
        cout<<"链表中只有一个元素!";
        exit(1);
    }
    LinkNode<T>* pre;
    LinkNode<T>* p;
    LinkNode<T>* next;
    pre=first;
    p=first->link;
    next=first->link;
    
    while(p!=NULL)
    {
        //指向断点后的第二个结点
        next=next->link;
        //让断点后的第一个结点的指针域指向
        //断点前的最后一个结点
        p->link=pre;
        //pre向后推进一格
        pre=p;
        //p和next指向断点后的第一个结点
        p=next;
    }
    //把逆转后的尾结点(即原来的头结点)
    //的指针域设为NULL
    first->link=NULL;
    //显示逆转后的的链表的所有元素
    //因为本链表在逆转前是含有附加头结点的、
    //所以反向遍历的时候可以不用遍历附加头结点
    while(pre->link!=NULL)
    {
        cout<<pre->data<<" ";
        pre=pre->link;
    }
    cout<<endl;
}
////////////////////////////////////reverseList()函数结束

/////////////////////////////////////////////////////////
//hangRear()函数
//把已知地址的结点挂入当前结点
/////////////////////////////////////////////////////////
template<class T>
void List<T>::hangRear(LinkNode<T>* ptr)
{
    LinkNode<T>* rear=getHead();
    //首先找到当前链表的尾指针
    while(rear->link!=NULL)
    {
        //指针向后推进
        rear=rear->link;
    };
    //把结点挂入rear指针
    rear->link=ptr;
};
///////////////////////////////////////hangRear()函数结束

/////////////////////////////////////////////////////////
//getNo()函数  得到已知的指针所
//向的结点在当前链表中的序列号
/////////////////////////////////////////////////////////
template<class T>
int List<T>::getNo(LinkNode<T>* ptr)
{
    //游标指针
    LinkNode<T>* p=getHead();
    //计数器
    int count=0;
    while(p->link!=NULL && p!=ptr)
    {
        count++;
        p=p->link;
    }
    return count;
};
//////////////////////////////////////////getNo()函数结束

/////////////////////////////////////////////////////////
//displayFre()公有成员函数   显示所有结点的访问次数
/////////////////////////////////////////////////////////
template<class T>
void List<T>::displayFre()
{
    if(IsEmpty())
        cout<<"链表为空!"<<endl;
    else
    {
        LinkNode<T>* ptr=first->link;    //游标指针
        int i=1;                         //结点序号
        while(ptr!=NULL)
        {
            cout<<i<<" frequency:"<<ptr->fre<<endl;
            ptr=ptr->link;
            i++;
        }
    }
}
/////////////////////////////////////displayFre()函数结束

/////////////////////////////////////////////////////////
//SortFre()公有成员函数   对结点按Fre从大到小排序
/////////////////////////////////////////////////////////
template<class T>
void List<T>::SortFre()
{
    //开辟一个指针数组存放每个结点的指针
    LinkNode<T>** Point=new LinkNode<T>*[Length()];
    //断言内存分配成功
    assert(Point);
    //把结点的地址依次放入Point中去
    LinkNode<T>* ptr=first->link;     //游标指针
    int i=0;                          //序号计数器
    while(ptr!=NULL)
    {
        Point[i]=ptr;
        i++;
        ptr=ptr->link;
    }
    //对Point数组里的指针按照fre降序排列
    int j,k;
    LinkNode<T>* tempt;
    for(i=0;i<Length()-1;i++)
    {
        k=i;
        for(j=i+1;j<Length();j++)
            if(Point[j]->fre>Point[k]->fre)
                k=j;
        if(i!=k)
        {
            tempt=Point[i];
            Point[i]=Point[k];
            Point[k]=tempt;
        }
    }
    
    //把指针重新连接
    int Len=Length();
    first->link=Point[0];
    for(i=1;i<Len-1;i++)
    {
        Point[i-1]->link=Point[i];
    }
    Point[Len-1]=NULL;
};
////////////////////////////////////////SortFre()函数结束

#endif
2008-09-25 21:50
出海之渔人
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-9-25
收藏
得分:0 
强悍!

我要学好C++,坚守住自己的理想!
2008-09-25 22:55
huyizhu
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2008-8-29
收藏
得分:0 
回复 5# geninsf009 的帖子
太谢谢了啊
2008-09-26 18:33
小朱朱
Rank: 1
来 自:佛山
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-9-26
收藏
得分:0 
厉害啊!!!
2008-09-26 23:53
J_j
Rank: 1
等 级:新手上路
威 望:1
帖 子:100
专家分:0
注 册:2008-8-21
收藏
得分:0 
顶一下!强悍啊啊!!
2008-09-27 00:23
快速回复:求助数据结构编程
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030535 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved