2.3线性表的链式表示和实现

第一次发文

在学习完数据结构线性表得链式表示和实现后,自己打了课本上的代码,在此记录一下

头文件内容 "LinkList"

template <typename T>
struct Node
{
    T data;
    Node<T> *next;
};
template <typename T>
class LinkList
{
private:
    Node<T> *head;
    Node<T> *GetPtr(int i);
public:
    LinkList();
    ~LinkList();
    LinkList(LinkList &L);
    LinkList(T a[],int n);
    int Length();
    bool Empty();
    void Clear();
    void PrintList();
    bool GetElem(int i,T &e);
    bool SetElem(int i,T e);
    int Search(T e);
    bool Insert(int i,T e);
    bool Delete(int i,T &e);
};
template <typename T>
LinkList<T>::LinkList()
{
    head=new Node<T>;
    head->next=NULL;
}
template <typename T>
LinkList<T>::~LinkList()
{
    Clear();
    delete head;
}
template <typename T>
LinkList<T>::LinkList(LinkList &L)
{
    Node<T> *pre,*p;
    head=new Node<T>;
    head->next=NULL;
    pre=head;
    T e;
    for(int i=1;i<=L.Length();i++)
    {
        L.GetElem(i,e);
        p=new Node<T>;
        p->data=e;
        p->next=NULL;
        pre->next=p;
        pre=p;
    }
}
template <typename T>
Node<T> *LinkList<T>::GetPtr(int i)
{
    if(i==0)
        return head;
    Node<T> *p=head->next;
    int count=1;
    while(count<i)
    {
        p=p->next;
        count++;
    }
    return p;
}
template <typename T>
LinkList<T>::LinkList(T a[],int n)
{
    head=new Node<T>;
    head->next=NULL;
    Node<T> *pre=head,*p=NULL;
    for(int i=0;i<n;i++)
    {
        p=new Node<T>;
        p->data=a[i];
        p->next=NULL;
        pre->next=p;
        pre=p;
    }
}
template <typename T>
int LinkList<T>::Length()
{
    int len=0;
    Node<T> *p=head->next;
    while(p!=NULL)
    {
        len++;
        p=p->next;
    }
    return len;
}
template <typename T>
bool LinkList<T>::Empty()
{
    return head->next==NULL;
}
template <typename T>
void LinkList<T>::Clear()
{
    Node<T> *p=head->next;
    while(p!=NULL)
    {
        head->next=p->next;
        delete p;
        p=head->next;
    }
}
template <typename T>
void LinkList<T>::PrintList()
{
    Node<T> *p=head->next;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}
template <typename T>
bool LinkList<T>::GetElem(int i,T &e)
{
    if(i<1||i>Length())
        return false;
    Node<T> *p;
    p=GetPtr(i);
    e=p->data;
    return true;
}
template <typename T>
bool LinkList<T>::SetElem(int i,T e)
{
    if(i<1||i>Length())
        return false;
    Node<T> *p=GetPtr(i);
    p->data=e;
    return true;
}
template <typename T>
int LinkList<T>::Search(T e)
{
    Node<T> *p=head->next;
    int i=1;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
        i++;
    }
    if(p==NULL)
        return 0;
    else
        return i;
}
template <typename T>
bool LinkList<T>::Insert(int i,T e)
{
    if(i<1||i>Length()+1)
        return false;
    Node<T> *q,*p;
    p=GetPtr(i-1);
    q=new Node<T>;
    q->data=e;
    q->next=p->next;
    p->next=q;
    return true;
}
template <typename T>
bool LinkList<T>::Delete(int i,T &e)
{
    if(i<1||i>Length())
        return false;
    Node<T> *p,*q;
    p=GetPtr(i-1);
    q=p->next;
    e=q->data;
    p->next=q->next;
    delete q;
    return true;
}

以下为测试"LinkList"正确性代码

#include<iostream>
#include"LinkList.h"
using namespace std;
int main()
{
    LinkList<int> LL1;
    int a[5]={11,22,33,44,55};
    LinkList<int> LL2(a,5);
    cout<<LL2.Length()<<endl;
    cout<<LL2.Empty()<<endl;
    LL2.PrintList();
    int e;
    LL2.GetElem(1,e);
    cout<<e<<endl;
    e=100;
    LL2.SetElem(1,e);
    LL2.PrintList();
    int ans=LL2.Search(33);

    cout<<ans<<endl;
    LL2.Insert(1,99);
    LL2.PrintList();
    LL2.Delete(5,e);
    cout<<e<<endl;
    LL2.PrintList();
    LinkList<int> LL3(LL2);
    LL3.PrintList();
    system("pause");
    return 0;
}

在此记录自己的学习!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值