当前位置:编程学习 > C/C++ >>

单链表中重复元素的删除;单链表的就地逆置.

[cpp] 
/**a. 编写文件LinkNode.h和Linklist.h,定义单链表类模板Linklist,以及其上的TailInsert、遍历及初始化等操作。
    b. 利用带头结点的单链表结构,在Linklist.h文件中添加两个成员函数:
(1) Delete(Linklist<int> &L)用于实现单链表中重复元素的删除;
(2) Reverse(Linklist<int> &L)用于实现单链表的就地逆置(即在原表的存储空间实现元素的逆置)。
编写算法Print(const int &)用于实现数据元素的输出。
*/   www.zzzyk.com
#include<iostream> 
#include"LinkList.h" 
using namespace std; 
void print(const int& e) 

    cout<<e<<" "; 

int main() 

    LinkList<int> lt; 
    int array[12] = {2,3,3,4,5,5,7,8,8,9,10,23}; 
    for(int i = 0;i <= 11;i++) 
    { 
        cout<<array[i]<<" "; 
        lt.Append(array[i]); 
    } 
    cout<<endl; 
    lt.Reverse(); 
    lt.Traverse(print); 
    cout<<endl; 
    lt.Delete(); 
    lt.Traverse(print); 
    return 0; 

/***************头文件***************/ 
#include<iostream> 
template<class T> 
struct LinkNode 

    T data; 
    LinkNode<T> *next; 
}; 
 
template<class T> 
class LinkList 

public: 
    LinkList(); 
    LinkList(const LinkList<T>&); 
    ~LinkList(); 
    bool IsEmpty()const{return len<=0;} 
    int Length()const{return len;} 
    void Clear(); 
    bool GetElem(T&,int)const; 
    bool SetElem(const T&,int); 
    int LocateElem(const T&)const; 
    int LocatePrior(const T&)const; 
    int LocateNext(const T&)const; 
    bool Insert(const T&,int); 
    bool Append(const T&); 
    bool Delete(T&,int); 
    void Traverse(void(*visit)(const T&))const; 
    LinkList<T>& operator=(const LinkList<T>&); 
    void Delete(); 
    void Reverse(); 
 
private: 
    int len; 
    LinkNode<T> *head; 
    LinkNode<T> *tail; 
    void CopyFrom(const LinkList<T>&); 
}; 
using namespace std; 
template<class T> 
LinkList<T>::LinkList()//默认构造函数 

    len=0; 
    head=tail=new LinkNode<T>; 
    head->next=NULL; 

template<class T> 
LinkList<T>::LinkList(const LinkList<T>& r)//拷贝构造函数 

    CopyFrom(r); 

template<class T> 
LinkList<T>::~LinkList()//析构函数 

    Clear(); 
    delete head; 

template<class T> 
void LinkList<T>::Clear()//清空链表 

    LinkNode<T>* p=head->next,*q; 
    while(p) 
    { 
        q=p->next; 
        delete p; 
        p=q; 
    } 
    tail=head; 
    head->next=NULL; 
    len=0; 

template<class T> 
bool LinkList<T>::GetElem(T&e,int i)const//获得第i位的元素 

    if(i<1 || i>len) 
        return false; 
    LinkNode<T> *p=head->next; 
    int k=1; 
    while(k<i) 
    { 
        p=p->next; 
        k++; 
    } 
    e=p->data; 
    return true; 

template<class T> 
bool LinkList<T>::SetElem(const T&e,int i)//设置第i位置的元素为e 

    if(i<1 || i>len) 
        return false; 
    LinkNode<T> *p=head->next; 
    int k=1; 
    while(k<i) 
    { 
        p=p->next; 
        k++; 
    } 
    p->data=e; 
    return true; 

template<class T> 
int LinkList<T>::LocateElem(const T&e)const 

    int i=1; 
    LinkNode<T> *p=head->next; 
    while(p && p->data!=e) 
    { 
        i++; 
        p=p->next; 
    } 
    if(p) 
        return i; 
    return 0; 

template<class T> 
int LinkList<T>::LocatePrior(const T&e)const 

    int i=LocateElem(e); 
    if(i>1) 
        return i-1; 
    else 
        return 0; 

template<class T> 
int LinkList<T>::LocateNext(const T&e)const 

    int i=LocateElem(e); 
    if(i>=1 && i<len) 
        return i+1; 
    else 
        return 0; 

template<class T> 
bool LinkList<T>::Insert(const T&e,int i) 

    LinkNode<T> *p,*q; 
    int k=1; 
    if(i<1 || i>len+1) 
        return false; 
    q=new LinkNode<T>; 
    q->data=e; 
    p=head; 
  
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,