使用C++的模板特性写一个通用的模板链表类,包括删除、插入、反转等功能实现

#pragma once
#include <iostream>
#include <vector>
#include <stack>
template <class object>
struct ListNode
{
    object data;
    struct ListNode<object> *next;
    ListNode<object>(int x):data(x),next(NULL){}
};
template <class object>

//构造链表
ListNode<object> *creatListOfhead()
{
    //带头结点的链表
    ListNode<object> *head=NULL;
    ListNode<object> *pHead=NULL;
    head=new ListNode<object>(sizeof(ListNode<object>));
    head->next=NULL;
    int listLenght=0;
    object elem;
    std::cout<<"构造链表的长度:"<<std::endl;
    cin>>listLenght;
    for (int i=0;i<listLenght;++i)
    {
        pHead=new ListNode<object>(sizeof(ListNode<object>));
        if (pHead)
        {
            std::cin>>elem;
            pHead->data=elem;
            pHead->next=head->next;
            head->next=pHead;
        }
        

    }
    return head->next;
};

//打印链表
template <class object>
void printList(ListNode<object> *list)
{
    if (list==NULL)
    {
        return ;
    }
    else
    {
        ListNode<object> *pHead=list;
        while (pHead!=NULL)
        {
            std::cout<<pHead->data<<" ";
            pHead=pHead->next;
        }
    }
    std::cout<<std::endl;
    return ;
}
template <class object>
ListNode<object>* createListOfRear()
{
    ListNode<object> *head=NULL;
    ListNode<object> *newHead=NULL;
    head=new ListNode<object>(sizeof(ListNode<object>));
    head->next=NULL;
    newHead=head;
    ListNode<object> *pHead=NULL;
    int listLenght=0;
    object elem;
    std::cout<<"构造链表的长度:"<<std::endl;
    std::cin>>listLenght;
    for (int i=0;i<listLenght;++i)
    {
        pHead=new ListNode<object>(sizeof(ListNode<object>));
        if (pHead)
        {
            std::cin>>elem;
            pHead->data=elem;
            pHead->next=head->next;
            head->next=pHead;
            head=pHead;
        }
        
    }
    //std::cout<<std::endl;
    return newHead->next;
}
 //按位置插入
template <class object>
ListNode<object> *insertNodeOfIndex(ListNode<object> *list,object index)
{
    ListNode<object> *newList=NULL;
    ListNode<object> *head=list->next;
    newList=list;
    int count=0;
    object elem;
    while (head!=NULL&&count<index-1)
    {
        
        head=head->next;
        count++;
    }
    if (count!=index-1)
    {
        cout<<"index 太大或者index 为0"<<endl;
    }
    else
    {
        ListNode<object> *newNode=NULL;
        newNode=new ListNode<object>(sizeof(ListNode<object>));
        if (newNode)
        {
            cin>>elem;
            newNode->data=elem;
            newNode->next=head->next;
            head->next=newNode;
        }

    }
    return newList;
}

//按值插入
template <class object>
ListNode<object> *insertNodeOfval(ListNode<object> *list,object elem)
{
    ListNode<object> *newList=NULL,*head=NULL;
    newList=head=list;
    ListNode<object> *pHead=list->next;
    while (pHead&&pHead->data!=elem)
    {
        head=pHead;
        pHead=pHead->next;
    }
    if (pHead->data==elem)
    {
        object data;
        ListNode<object> *newNode=new ListNode<object>(sizeof(ListNode<object>));
        if (newNode)
        {
            cin>>data;
            newNode->data=data;
            newNode->next=head->next;
            head->next=newNode;
        }
    }
    else
    {
        cout<<"不存在这个val"<<endl;

    }


    return newList;
}

//按位置删除
template <class object>
ListNode<object> *deleteNodeOfIndex(ListNode<object> *list,object index)
{
    ListNode<object> *head=list;
    ListNode<object> *newList=head;
    ListNode<object> *pHead=list->next;
    int count=1;
    while (head->next!=NULL&&count<index)
    {
        
        head=pHead;
        pHead=pHead->next;
        count++;
    }
    
    if (count!=index)
    {
        cout<<"下标太大了或者为0"<<endl;
        
    }
    else
    {
        head->next=pHead->next;
        delete pHead;
    }
    
    return newList;
}

//按值删除
template<class object>
ListNode<object> *deleteNodeOfKey(ListNode<object> *list,object key)
{
    ListNode<object> *head=list;
    ListNode<object> *deletNode=list->next;
    while(deletNode!=NULL&&deletNode->data!=key)
    {
        head=deletNode;
        deletNode=deletNode->next;
    }
    if (deletNode->data==key)
    {
        head->next=deletNode->next;
        delete deletNode;
    }
    else
    {
        cout<<"结点不存在"<<endl;
    }
    
    return list;
}

//删除重复的
template<class object>
ListNode<object> *deleteDupp1(ListNode<object> *list)
{
    ListNode<object> *head=list;
    while (head->next!=NULL)
    {
        if (head->data==head->next->data)
        {
            head->next=head->next->next;
        }
        else
        {
            head=head->next;
        }
    }
    return list;
}
template<class object>

//删除两个重复的
ListNode<object> *deleteDupp2(ListNode<object> *list)
{
    ListNode<object> *head=list;
    ListNode<object> *newListNodeHead=new ListNode<object>(sizeof(ListNode<object>));
    newListNodeHead->next=head;
    ListNode<object> *newList=newListNodeHead;
    while (head)
    {
        while(head->next!=NULL&&head->data==head->next->data)
        {
            head=head->next;
        }
        //if (newList->next==head)
        //{
            newList=head;
            ///head=head->next;
        //}
        //else
        //{
            head=head->next;
            newList->next=head;
        //}
    }
    return newListNodeHead->next;
}
template<class object>

//删除链表中连续重复的值
ListNode<object> *deleteSameVal(ListNode<object> *list,object SameVal)
{
    ListNode<object> *head=list;
    ListNode<object> *sameNode=NULL;
    ListNode<object> *pHead=list->next;
    while (pHead)
    {
        if (pHead->data==SameVal)
        {
            sameNode=pHead;
            pHead=pHead->next;
            head->next=pHead;
            delete sameNode;
        }
        else
        {
            head=pHead;
            pHead=pHead->next;
        }
    }
    return list;
}

//反转链表
template<class object>
ListNode<object> *reverseList(ListNode<object> *list)
{
    ListNode<object> *reverse_list=new ListNode<object>(sizeof(ListNode<object>));
    reverse_list->next=NULL;
    ListNode<object> *re=reverse_list;
    ListNode<object> *head=list;
    while (head!=NULL)
    {
        ListNode<object> *pHead=head->next;
        head->next=reverse_list->next;
        reverse_list->next=head;
        head=pHead;
    }
    return re->next;
}

//反转链表
template<class object>
ListNode<object> *revList(ListNode<object> *list)
{
    ListNode<object> *headNode=new ListNode<object>(sizeof(ListNode<object>));
    headNode->next=list;
    ListNode<object> *pre=list;
    ListNode<object> *pcur=list->next;
    while(pcur)
    {
        pre->next=pcur->next;
        pcur->next=headNode->next;
        headNode->next=pcur;
        pcur=pre->next;
    }
    return headNode->next;
}

面向对象程序设计课程作业 1. 请创建一个数据型为T的链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编main函数,测试该类模板的正确性: 1) 用List模板定义一个List型的模板对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List型的模板对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List型的模板对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List型的模板对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值