1.顺序表:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>
using namespace std;
typedef int DataType;
class Seqlist
{
public:
Seqlist()
:_array(NULL)
,_size(0)
,_capatify(0)
{
}
Seqlist(const Seqlist& s)
{
_array=(DataType*)malloc(s._size*sizeof(DataType));
memcpy(_array,s._array,s._size*sizeof(DataType));
_size=_capatify=s._size;
}
Seqlist operator=(const Seqlist& s)
{
free(_array);
Swap(s);
return *this;
}
~Seqlist()
{
if(_array)
{
free(_array);
_array=NULL;
_size=_capatify=0;
}
}
void Swap(const Seqlist& s)
{
_array=s._array;
_size=s._size;
_capatify=s._capatify;
}
void PushBack(DataType x)//尾插
{
//1.没有节点时
//2.有一个节点和多个节点
//1、2是一样的方法
CheckCapatify();
_array[_size]=x;
_size++;
}
void PushFront(DataType x)//头插
{
//1.没有节点时
//2.有一个或者多个节点
if(_size==0)
{
CheckCapatify();
_array[_size]=x;
}
else
{
CheckCapatify();
int end=(int)_size-1;
int i = 0;
for(i=end;i>=0;i--)
{
_array[i+1]=_array[i];
}
_array[0]=x;
}
_size++;
}
void CheckCapatify()//检查是否需要增容
{
if(_size==_capatify)
{
_capatify=2*_capatify+3;
_array=(DataType*)realloc(_array,_capatify*(sizeof(DataType)));
assert(_array);//检查增容是否失败
}
}
void Insert(size_t pos,DataType x)//定点插入
{
assert(pos<=_size);
CheckCapatify();
if(pos==0)
PushFront(x);
else if(pos==_size)
PushBack(x);
else
{
int end=(int)_size-1;
CheckCapatify();
while(end!=pos-1)
{
_array[end+1]=_array[end];
end--;
}
_array[pos]=x;
}
_size++;
}
void PopBack()//尾删
{
//1.没有节点
//2.有节点
if(_size==0)
{
return;
}
else
{
_array[_size]=NULL;
_size--;
}
}
void PopFront()//头删
{
//1.没有节点
//2.有节点
if(_size==0)
{
return;
}
else
{
int end=(int)_size-1;
int i = 0;
for(;i<end;i++)
{
_array[i]=_array[i+1];
}
_size--;
}
}
void Earse(size_t pos)//定点删除
{
//1.pos==0;
//2.pos==size_t;
//3.pos<size_t;
assert(pos<_size&&(pos>=0));
if(pos==0)
PopFront();
else if(pos==_size)
PopBack();
else
{
int end=(int)_size-1;
int i = 0;
for(i=pos;i<end;i++)
{
_array[i]=_array[i+1];
}
_size--;
}
}
void print()
{
size_t i= 0;
for(i=0;i < _size;i++)
{
cout<<_array[i]<<" ";
}
cout<<endl;
}
private:
DataType* _array;
size_t _size;
size_t _capatify;
};
void test1()//测试
{
Seqlist s;
s.PushBack(1);
s.PushBack(2);
s.PushBack(3);
s.PushBack(5);
s.print();
s.PushFront(0);
s.print();
s.Insert(4,4);
s.print();
s.PopBack();
s.print();
s.PopFront();
s.print();
s.Earse(3);
s.print();
}
int main()
{
test1();
return 0;
}
2.单链表:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>
using namespace std;
typedef int DataType;
struct SlistNode
{
SlistNode* _next;
DataType _data;
SlistNode(DataType x)
:_next(NULL)
,_data(x)
{
}
};
class Slist
{
typedef SlistNode Node;
public:
Slist()
:_head(NULL)
,_tail(NULL)
{
}
Slist(const Slist& s)
:_head(NULL)
,_tail(NULL)
{
Node* cur=(Node*)s._head;
while(cur!=NULL)
{
PushBack(cur->_data);
cur=cur->_next;
}
}
~Slist()
{
Node* cur=_head;
while(cur!=NULL)
{
Node* temp=cur;
cur=cur->_next;
delete temp;
}
_head=_tail=NULL;
}
Slist& operator=(const Slist& s)
{
Node* cur=(Node*)s._head;
while(cur!=NULL)
{
PushBack(cur->_data);
cur=cur->_next;
}
return *this;
}
void PushBack(DataType x)//尾插
{
//1.没有节点
//2.有节点
if((_head==NULL)&&(_tail==NULL))
{
_tail=_head=new Node(x);
}
else
{
_tail->_next=new Node(x);
_tail=_tail->_next;
}
}
void PushFront(DataType x)//头插
{
//1.没有节点
//2.有节点
if(_head==NULL)
{
_head=_tail=new Node(x);
}
else
{
Node* temp= new Node(x);
temp->_next=_head;
_head=temp;
}
}
Node* Find(DataType x,const Slist& s)//查找节点
{
Node* cur=s._head;
while(cur)
{
if(cur->_data==x)
return cur;
cur=cur->_next;
}
return NULL;
}
void Insert(Node* pos,DataType x)//在pos前插一个节点
{
assert(pos);
if(pos==_head)
PushFront(x);
else
{
Node* cur = _head;
while(cur->_next!=pos)
{
cur=cur->_next;
}
Node* temp=new Node(x);
temp->_next=cur->_next;
cur->_next=temp;
}
}
void PopBack()//尾删
{
//1.没有节点
//2.有1个节点
//3.有多个节点
if(_head==NULL)
{
return;
}
else if(_head->_next==NULL)
{
delete _head;
_head=NULL;
_tail=_head;
}
else
{
Node* cur=_head;
while(cur->_next->_next!=NULL)
{
cur=cur->_next;
}
delete cur->_next;
cur->_next=NULL;
_tail=cur;
}
}
void PopFront()//头删
{
//1.没有节点
//2.有1个节点
//3.有多个节点
if(_head==NULL)
{
return;
}
else
{
Node* cur=_head;
_head=_head->_next;
delete cur;
}
}
void Earse(Node* pos)//删除pos位置的节点
{
//1.pos==_head
//2.pos==_tail;
//3.pos在_head和_tail之间
assert(pos);
if(pos==_head)
PopFront();
if(pos==_tail)
PopBack();
else
{
Node* cur=_head;
while(cur->_next!=pos)
{
cur=cur->_next;
}
cur->_next=cur->_next->_next;
delete pos;
}
}
void print()
{
if(_head==0)
{
cout<<"NULL"<<endl;
}
else
{
Node* cur=_head;
while(cur)
{
cout<<cur->_data<<" ";
cur=cur->_next;
}
cout<<endl;
}
}
private:
Node* _head;
Node* _tail;
};
void test1()//测试
{
Slist s,s1;
SlistNode* temp=NULL;
s.PushBack(1);
s.PushBack(2);
s.PushBack(3);
s.print();
s.PushFront(0);
s.print();
temp=s.Find(0,s);
s.Insert(temp,-1);
s.print();
s.PopBack();
s.print();
s1.print();
s.PopFront();
s.print();
temp=s.Find(1,s);
s.Earse(temp);
s.print();
Slist s2(s);
s2.print();
Slist s3;
s3=s2;
s3.print();
}
int main()
{
test1();
return 0;
}
3.双链表:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
typedef int DataType;
struct ListNode
{
ListNode* _next;
ListNode* _prev;
DataType _data;
ListNode(DataType x)
:_next(NULL)
,_prev(NULL)
,_data(x)
{
}
};
class List
{
typedef ListNode Node;
public:
List()//构造函数
:_head(NULL)
,_tail(NULL)
{
}
List(DataType x)//带参构造函数
:_head(NULL)
,_tail(NULL)
{
_head=new Node(x);
}
List(const List& l)//拷贝构造
:_head(NULL)
,_tail(NULL)
{
Node* cur=l._head;
if(l._head!=NULL)
{
while(cur)
{
PushBack(cur->_data);
cur=cur->_next;
}
}
}
List& operator=(const List& l)
{
if(this->_head!=l._head)
{
List temp(l);
swap(_head,temp._head);
swap(_tail,temp._tail);
}
return *this;
}
~List()//析构函数
{
if(_head!=NULL)
{
Node* cur=_head;
delete _head;
_head=cur;
}
_tail=_head=NULL;
}
void PushBack(DataType x)//尾插
{
//1.没有节点
//2.有一个节点
//3.有多个节点
if(_head==NULL)
{
_head=_tail=new Node(x);
}
else if(_head->_next==NULL)
{
_head->_next=new Node(x);
_tail=_head->_next;
_tail->_prev=_head;
}
else
{
Node* cur=_tail;
_tail->_next=new Node(x);
_tail=_tail->_next;
_tail->_prev=cur;
}
}
void PopBack()//尾删
{
//1.没有节点
//2.有1个节点
//3.有多个节点
if(_head==NULL)
return;
else if(_head->_next==NULL)
{
delete _head;
_tail=_head=NULL;
}
else
{
Node* temp=_tail;
_tail=_tail->_prev;
_tail->_next=NULL;
delete temp;
}
}
void PushFront(DataType x)//头插
{
//1.没有节点
//2.有1个节点和多个节点
if(_head==NULL)
_head=_tail=new Node(x);
else
{
Node* cur=_head;
_head=new Node(x);
_head->_next=cur;
}
}
void PopFront()//头删
{
//1.没有节点
//2.有一个节点
//3.有多个节点
if(_head==NULL)
return;
else if(_head->_next==NULL)
{
delete _head;
_head=_tail=NULL;
}
else
{
Node* cur = _head;
_head=_head->_next;
delete cur;
}
}
Node* Find(DataType x,List& l)//查找位置
{
Node* cur=l._head;
while(cur)
{
if(cur->_data==x)
return cur;
else
cur=cur->_next;
}
return NULL;
}
void Insert(Node* pos,DataType x)//在pos前插入一个节点
{
//1.头插
//2.其余位置插
if(pos==_head)
PushFront(x);
else
{
Node* temp=new Node(x);
pos->_prev->_next=temp;
temp->_prev=pos->_prev;
temp->_next=pos;
pos->_prev=temp;
}
}
void Earse(Node* pos)
{
//1.头删
//2.尾删
//3.其余位置删
if(pos==_head||pos->_prev==NULL)
PopFront();
else if(pos==_tail||pos->_next==NULL)
PopBack();
else
{
Node* front = pos->_prev;
Node* back = pos->_next;
front->_next=back;
back->_prev=front;
}
}
void Reverse()
{
//1.没有节点
//2.有1个节点
//3.有多个节点
Node* cur = _head;
if(_head==NULL||_head->_next==NULL)
return;
else
{
while(cur)
{
Node* temp=cur->_next;
cur->_next=cur->_prev;
cur->_prev=temp;
cur=cur->_prev;
}
Node* temp=_head;
_head=_tail;
_tail=_head;
}
}
void print()//打印
{
Node* cur=_head;
while(cur)
{
cout<<cur->_data<<"->";
cur=cur->_next;
}
cout<<"NULL"<<endl;
}
private:
Node* _head;
Node* _tail;
};