64,642
社区成员
发帖
与我相关
我的任务
分享
要插入的代码
”
“的中间即要插入的代码
。#ifndef CTEMPALTELIST_H
#define CTEMPALTELIST_H
#include <assert.h>
#define NULL 0
#include <iostream>
using namespace std;
template<class T>
class CTempalteList
{
typedef struct LIST
{
T Data;
struct LIST* Next;
}CList;
public:
CTempalteList();
CTempalteList(const CTempalteList& List);
virtual ~CTempalteList();
protected:
private:
CList* m_Head;//头
CList* m_EndList;//末尾元素
unsigned int m_Count;//计数
public:
void Add(const T Data);//加入元素
const T GetAt(const unsigned int Index)const;//通过索引得到该节点的值
const unsigned int GetSize()const;//获取链表的大小
T operator[](const unsigned int Index)const;//重载[]运算符
friend const CTempalteList<T> operator+( const CTempalteList<T>& Elem1, const CTempalteList<T>& Elem2)//连接两个链表得到新的链表
{
CTempalteList<T> List;
for(int i=0;i<Elem1.m_Count;i++)
{
List.Add(Elem1.GetAt(i));
}
for(int i=0;i<Elem2.m_Count;i++)
{
List.Add(Elem2.GetAt(i));
}
return List;
}
void operator=(const CTempalteList& List);
void Remove();//删除所有的元素
void Remove(const unsigned int Index);//删除指定位置的值
int Insert(const unsigned int Index,T NewData);//在指定位置插入一个值,返回为链表插入后的长度,如果插入失败则返回为原来的长度否则为新的长度
int Insert(const unsigned int Index,CTempalteList *catList);//在指定位置插入一个值,返回为链表插入后的长度,如果插入失败则返回为原来的长度否则为新的长度
int SetAt(const unsigned int Index,T Data);//修改指定位置的数据
private:
inline CList* GetDataList(const unsigned int Index)const;
};
template<class T>
typename CTempalteList<T>::CList* CTempalteList<T>::GetDataList(const unsigned int Index)const
{
CList* Elem=m_Head;
for(int i=0;i<m_Count;i++)
{
if(i==Index)break;
Elem=Elem->Next;
}
return Elem;
}
#endif // CTEMPALTELIST_H
#include "F:\workspace\CTempalteList\include\\CTempalteList.h"
template<class T>
CTempalteList<T>::CTempalteList()
{
m_Head=NULL;
m_Count=0;
m_EndList=NULL;
//ctor
}
template<class T>
CTempalteList<T>::CTempalteList(const CTempalteList& List)
{
m_Head=NULL;
m_Count=0;
m_EndList=NULL;
for(int i=0;i<List.m_Count;i++)
Add(List.GetAt(i));
}
template<class T>
CTempalteList<T>::~CTempalteList()
{ //dtor
Remove();
}
template<class T>
void CTempalteList<T>::Add(const T Data)
{
CList* Elem=new CList();
Elem->Data=Data;
Elem->Next=NULL;
if(m_Head==NULL&&m_EndList==NULL)
{
m_EndList=m_Head=Elem;
}
m_EndList=m_EndList->Next=Elem;
m_Count++;
}
template<class T>
const T CTempalteList<T>::GetAt(const unsigned int Index) const
{
assert(Index>=0&&Index<m_Count);
if(Index<0||Index>=m_Count)return NULL;
return GetDataList(Index)->Data;
}
template<class T>
const unsigned int CTempalteList<T>::GetSize()const
{
return m_Count;
}
template<class T>
T CTempalteList<T>::operator[](const unsigned int Index)const
{
assert(Index>=0&&Index<m_Count);
if(Index<0||Index>=m_Count)return NULL;
return GetDataList(Index)->Data;
}
template<class T>
void CTempalteList<T>::operator=(const CTempalteList<T>& List)
{
if(List.m_Head!=NULL)
{
Remove();
for(int i=0;i<List.m_Count;i++)
Add(List.GetAt(i));
}
// return *this;
}
template<class T>
void CTempalteList<T>::Remove()
{
if(m_Head!=NULL)
{
CList* NextList=NULL;
for(int i=0;i<m_Count;i++)
{
NextList=m_Head->Next;
delete m_Head;
m_Head=NextList;
}
m_Head=NULL;
m_Count=0;
m_EndList=NULL;
}
}
template<class T>
void CTempalteList<T>::Remove(const unsigned int Index)
{
assert(Index>=0&&Index<m_Count);
if(Index<0||Index>=m_Count)return;
if(Index==0)
{
CList* NextList=m_Head->Next;
delete m_Head;
m_Head=NextList;
}
else
{
CList* PreList=GetDataList(Index-1);//得到前一个元素的指针
CList* NextList=PreList->Next->Next;
if(PreList->Next==m_EndList)m_EndList=PreList;//防止删除最后一个指针时还能访问
delete PreList->Next;
PreList->Next=NextList;
}
m_Count--;
}
template<class T>
int CTempalteList<T>::Insert(const unsigned int Index,T NewData)
{
assert(Index>=0&&Index<m_Count);
if(Index<0||Index>=m_Count)return m_Count;
CList* NewList=new CList();
NewList->Data=NewData;
if(Index==0)
{
NewList->Next=m_Head;
m_Head=NewList;
}
else
{
CList* PreList=GetDataList(Index-1);//得到前一个元素的指针
NewList->Next=PreList->Next;
PreList->Next=NewList;
}
m_Count++;
return m_Count;
}
template<class T>
int CTempalteList<T>::Insert(const unsigned int Index,CTempalteList *catList)
{
assert(Index>=0&&Index<m_Count);
if(Index<0||Index>=m_Count)return m_Count;
const int Size=catList->GetSize();
CList* oldEndList=GetDataList(m_Count-1);//记录插入前最后元素的指针
//先将待插入的元素全部插入链表后面
for(int i=0;i< Size;i++)
{
Add(catList->GetAt(i));
}
CList* NewStartList=oldEndList->Next;//记录新插入元素的头指针
CList* NewEndList=GetDataList(m_Count-1);//记录插入后最后元素的指针
oldEndList->Next=NULL;//将新增的链表暂时与旧表断开
if(Index==0)
{
NewEndList->Next=m_Head;
m_Head=NewStartList;
}
else
{
CList* InertList=GetDataList(Index-1);
NewEndList->Next=InertList->Next;
InertList->Next=NewStartList;
}
}
template<class T>
int CTempalteList<T>::SetAt(const unsigned int Index,T Data)
{
assert(Index>=0&&Index<m_Count);
if(Index<0||Index>=m_Count)return -1;
CList* PreList=GetDataList(Index);//得到前一个元素的指针
assert(PreList);
PreList->Data=Data;
}
int main(void)
{
CTempalteList<int> list;
for(int i=0;i<5;i++)
list.Add(i);
list=list+list;
list.SetAt(0,100);
for(int i=0;i<list.GetSize();i++)
cout<<list.GetAt(i)<<" ";
return 0;
using namespace std;
#include <iostream>
#include <iostream>
#include<iomanip>
using namespace std;
#include <iostream>
using namespace std;
struct ListNode
{
int data;
ListNode *next;
}; //定义单链表的结点类型node
class LinkList //定义LinkList类
{
public:
LinkList(); //构造函数
~LinkList(); //析构函数
void CreateListTail(); //成员函数CreateListTail,用尾插入法建立单链表
void CreateListHead(); //成员函数CreateListTail,用头插入法建立单链表
void ListInsert(); //成员函数ListInsert,插入元素
void ListDelete(); //成员函数ListDelete,删除元素
void ListFind(); //成员函数ListFind,查找元素
void Listlength(); //成员函数Listlength,显示单链表长度
void Listreverse(); //成员函数Listreverse,单链表逆值
void ListPrint(); //成员函数ListPrint,显示当前链表
public:
ListNode *head,*tail;int length;
};
/////////////////////////////////////////////////////////////////////////////////////LinkList::LinkList()
{
head=tail=NULL;
length=0;
}
LinkList::~LinkList()
{
ListNode *p;
while(head)
{
p=head;
head=head->next;
delete p;
}
}
/////////////////////////////////////////////////////////////////////////////////////
void LinkList::CreateListTail()
{
ListNode *p;
int i,n;
cout<<"请输入你想输入元素的个数:";
cin>>n;
length=n;
cout<<"请输入元素:";
head=tail=new ListNode;
cin>>head->data;
for(i=1;i<n;i++)
{
p=new ListNode;
cin>>p->data;
tail->next=p;
tail=p;
}
tail->next=NULL;
}
/////////////////////////////////////////////////////////////////////////////////////
void LinkList::CreateListHead()
{
ListNode *p;
int i,n;
cout<<"请输入你想输入元素的个数:";
cin>>n;
length=n;
cout<<"请输入元素:";
head=tail=new ListNode;
cin>>head->data;
for(i=1;i<n;i++)
{
p=new ListNode;
cin>>p->data;
p->next=head;
head=p;
}
tail->next=NULL;
}
/////////////////////////////////////////////////////////////////////////////////////
void LinkList::ListInsert()
{
int x,insert;ListNode *p,*o,*q,*t;
p=new ListNode;
cout<<"请你输入位置和元素:";
cin>>x>>insert;
if(x<1||x>length+1)
{
cout<<"Input Error!"<<endl;
}
else
{
if(x==1)
{
p->next=head;
head=p;
head->data=insert;
}
else
{
int j=1;
o=q=head;
while(j<x)
{
q=o;
o=o->next;
j++;
}
t=new ListNode;
t->next=o;
q->next=t;
t->data=insert;
}
length++;
}
}
/////////////////////////////////////////////////////////////////////////////////////void LinkList::ListDelete()
{
int x,j=1;ListNode *p,*q;
cout<<"请输入你想删除的位置:";
cin>>x;
if(x<1||x>length+1)
{
cout<<"Delete Error!"<<endl;
}
else
{
if(x==1)
{
p=head;
head=head->next;
delete p;
}
else
{
p=q=head;
while(j<x)
{
q=p;
p=p->next;
j++;
}
q->next=p->next;
delete p;
}
length--;
}
}
///////////////////////////////////////////////////////////////////////////////////
void LinkList::ListFind()
{
int Find;ListNode *p;
cout<<"请你输入待查找的元素:";
cin>>Find;
p=head;
while(p!=0 && p->data!=Find)
{
p=p->next;
}
if (p!=NULL) cout<<"找到此元素!"<<endl;
else
cout<<"没有找到此元素!"<<endl;
cout<<"请你选择你想要的功能:";
}
/////////////////////////////////////////////////////////////////////////////////////
void LinkList::Listlength()
{
cout<<"该链表长度为:"<<length<<endl;
cout<<"请你选择你想要的功能:";
}
/////////////////////////////////////////////////////////////////////////////////////
void LinkList::Listreverse()
{
ListNode *q,*p=head->next;
head->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=head;
head=q;
}
}
/////////////////////////////////////////////////////////////////////////////////////
void LinkList::ListPrint()
{
ListNode *p=head;
cout<<"当前链表为:";
while(p)
{
cout<<p->data<<setw(3);
p=p->next;
}
cout<<endl;
cout<<"请你选择你想要的功能:";
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
int main()
{
int t=1;LinkList s;
cout<<"/////////////////////////////////////////////////////"<<endl;
cout<<"/////////////////////////////////////////////////////"<<endl;
cout<<"/////////////////欢迎来到链表系统////////////////////"<<endl;
cout<<"/////////////////////////////////////////////////////"<<endl;
cout<<"菜单:"<<endl;
cout<<"0: 头建立链表"<<endl;
cout<<"1:尾建立链表"<<endl;
cout<<"2:插入元素"<<endl;
cout<<"3:删除元素"<<endl;
cout<<"4:查找元素"<<endl;
cout<<"5:显示链表长度"<<endl;
cout<<"6:链表逆值"<<endl;
cout<<"7:直接退出"<<endl;
cout<<"/////////////////////////////////////////////////////"<<endl;
cout<<"请你选择你想要的功能:";
while (t==1)
{
int choice;
cin>>choice;
switch (choice)
{
case 0:s.CreateListHead();s.ListPrint();break;
case 1:s.CreateListTail();s.ListPrint();break;
case 2:s.ListInsert();s.ListPrint();break;
case 3:s.ListDelete();s.ListPrint();break;
case 4:s.ListFind();break;
case 5:s.Listlength();break;
case 6:s.Listreverse();s.ListPrint();break;
case 7:t=0;cout<<"系统已退出!";break;
}
}
return 0;
}
void print(student *ss)