程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 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.2cto.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; 
    while(k<i) 
    { 
        p=p->next; 
        k++; 
    } 
    q->next=p->next; 
    p->next=q; 
    if(i==len+1)       //表尾插入後修改尾指針 
        tail=q; 
    ++len; 
    return true; 

template<class T> 
bool LinkList<T>::Append(const T&e)   //畫圖分析 

    LinkNode<T> *q; 
    q=new LinkNode<T>; 
    q->data=e; 
    tail->next=q; 
    tail=q;    //漏了一句,要自己寫,弄清原理 
    tail->next=NULL; 
    ++len; 
    return true; 

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

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

template<class T> 
void LinkList<T>::Traverse(void (*visit)(const T&e))const 

    LinkNode<T>*p=head->next; 
    while(p) 
    { 
        visit(p->data); 
        p=p->next; 
    } 
 

template<class T> 
LinkList<T>& LinkList<T>::operator=(const LinkList<T>&r) 

    Clear(); 
    delete head; 
    CopyFrom(r); 
    return *this; 

template<class T> 
void LinkList<T>::CopyFrom(const LinkList<T>& r) 

    len=0; 
    head=tail=new LinkNode<T>; 
    head->next=NULL; 
    LinkNode<T> *p=r.head->next; 
    while(p) 
    { 
        Append(p->data); 
        p=p->next; 
    } 

template <class ElemType> 
void  LinkList<ElemType>::Delete() 

     
    LinkNode<ElemType> *r,*t,*y,*q; 
    for(r = head;r != NULL;r = r->next) 
    { 
        q = r; 
        for(t = r->next;t!=NULL;t = t->next) 
        { 
            if(r->data < t -> data) 
                break; 
         
            if(r->data == t -> data) 
            { 
                q ->next = t->next; 
            } 
            else{ 
                q = q ->next; 
            } 
 
        } 
 
    } 

template <class ElemType> 
void  LinkList<ElemType>::Reverse() 

    int temp; 
    LinkNode<ElemType> *p = head->next,*q = head; 
    for(int i =0 ;i < len/2;i++) 
    { 
         
        for(int j = 0;j < len-i;j++) 
        { 
            q = q->next; 
 
        } 
        temp = q->data; 
        q->data = p -> data; 
        p->data = temp; 
        q = head; 
        p = p->next; 
    } 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved