封装了一个链表类,有空再详细讲解,后续还得写个矩阵类库。
测试结果:
完整代码:
/*
============================================================================
Name : 单链表(带表头L)
Author : Swair Fang,any question @qq swair@qq.com
Version : 3.1
Copyright : by Swair Fang
Description : 带表头的单链表,表头索引为-1, 后接链表0,1,2,3,4,5,6,7,8,。。。),实现了通用链表的功能
及 堆内单链表与栈内数组相互格式之间的转换。
功能:
1.获得链表长度
2.清空链表
3.查找元素索引
4.查找元素前一个元素索引
5.删除元素
6.插入操作,默认插入到第一个位置
7.在P位置后插入元素
8.索引P后插入元素
9.打印链表
10.数组转换为链表
11.链表转换为数组
12.根据索引得到值
13.给定内存地址之间的链表快速排序
14.给定索引区间内的连表快速排序
15.地址转换为索引
16.索引转换为地址
17.打印数组
============================================================================
*/
#ifndef _List_H
#define _List_H
#include
#include
#include
using namespace std;
template
class CList
{
typedef struct CNode
{
T Elt;
struct CNode *pNext;
} *Position;
private:
Position m_pList;
int m_iSize;
Position m_pNode;
public:
CList();
~CList();
//1.获得链表长度
int GetSize();
//2.清空链表
void Empty();
//3.查找元素索引
int Find(T X);
//4.查找元素前一个元素索引
int FindPrevious(T X);
//5.删除元素
void Delete(T X);
//6.插入操作,默认插入到第一个位置
void Insert(T X);
//7.在P位置后插入元素
void insert_after_p(Position P,T X);
//8.索引P后插入元素
void PInsert(int Pindex,T X);
//9.打印链表
void Print();
//10.数组转换为链表
void Array2List(const T *Ay,int Size);
//11.链表转换为数组
void List2Array(T *Ay,int Size);
//12.根据索引得到值
int GetValue(int index);
//13.给定内存地址之间的链表快速排序
void quick_sort(Position Head,Position Tail);
//14.给定索引区间内的连表快速排序
void QuickSort(int begin,int end);
//15.地址转换为索引
int Addr2Index(Position Addr);
//16.索引转换为地址
Position Index2Addr(int N)
{
m_pNode=m_pList;
int i;
for(i=-1;ipNext;
return m_pNode;
};
//17.打印数组
void PrintArray(T *Ay,int Size);
};
template
CList::CList()
{
m_pList=new CNode;
if(m_pList==NULL)
{
printf("Out of Space!!!");
exit(1);
}
m_pList->pNext=NULL;
m_iSize=0;
}
template
CList::~CList()
{
Position Tmp;
m_pNode=m_pList->pNext;
m_pList->pNext=NULL;
while(m_pNode!=NULL)
{
Tmp=m_pNode->pNext;
delete m_pNode;
m_pNode=Tmp;
}
delete m_pList;
}
template
int CList::GetSize()
{
return m_iSize;
}
template
void CList::Empty()
{
Position Tmp;
m_pNode=m_pList->pNext;
m_pList->pNext=NULL;
while(m_pNode!=NULL)
{
Tmp=m_pNode->pNext;
delete m_pNode;
m_pNode=Tmp;
}
m_iSize=0;
}
template
int CList::Find(T X)
{
int index=0;
m_pNode=m_pList->pNext;
while(m_pNode!=NULL&&m_pNode->Elt!=X)
{
m_pNode=m_pNode->pNext;
index++;
}
if(m_pNode==NULL)
{
printf("链表中无%d这个数\n",X);
return -1;
}
return index;
}
template
int CList::FindPrevious(T X)
{
int index=-1;
m_pNode=m_pList;
while(m_pNode->pNext!=NULL&&m_pNode->pNext->Elt!=X)
{
m_pNode=m_pNode->pNext;
index++;
}
if(m_pNode->pNext==NULL)
{
printf("链表中无%d这个数\n",X);
return -1;
}
return index;
}
template
void CList::Delete(T X)
{
Position TmpCell;
FindPrevious(X);
if(m_pNode->pNext!=NULL)
{
TmpCell=m_pNode->pNext;
m_pNode->pNext=m_pNode->pNext->pNext;
delete TmpCell;
m_iSize--;
}
}
template
void CList::Insert(T X)
{
Position TmpCell=new CNode;
TmpCell->Elt=X;
TmpCell->pNext=m_pList->pNext;
m_pList->pNext=TmpCell;
m_iSize++;
}
template
void CList::insert_after_p(Position P,T X)
{
Position TmpCell=new CNode;
if(TmpCell==NULL)
{
printf("Out of Space!!!");
exit(1);
}
TmpCell->Elt=X;
TmpCell->pNext=P->pNext;
P->pNext=TmpCell;
m_iSize++;
}
template
void CList::PInsert(int Pindex,T X)
{
Position P=Index2Addr(Pindex);
Position TmpCell=new CNode;
if(TmpCell==NULL)
{
printf("Out of Space!!!");
exit(1);
}
TmpCell->Elt=X;
TmpCell->pNext=P->pNext;
P->pNext=TmpCell;
m_iSize++;
}
template
void CList::Print()
{
if(m_pList->pNext==NULL)
printf("链表为空\n");
else
{
m_pNode=m_pList->pNext;
while(m_pNode!=NULL)
{
char *cp=(char*)m_pNode;
printf("0x%x: %d\n ",cp,m_pNode->Elt);
m_pNode=m_pNode->pNext;
}
printf("\n");
}
}
template
void CList::Array2List(const T *Ay,int Size)
{
Empty();
m_pNode=m_pList;
Position Tmp;
int i=0;
while(iElt=Ay[i];
Tmp->pNext=NULL;
m_pNode->pNext=Tmp;
m_pNode=m_pNode->pNext;
i++;
m_iSize++;
}
}
template
void CList::List2Array(T *Ay,int Size)
{
m_pNode=m_pList->pNext;
int i=0;
while(iElt;
m_pNode=m_pNode->pNext;
i++;
}
}
template
int CList::Addr2Index(Position Addr)
{
int index=0;
m_pNode=m_pList->pNext;
while(m_pNode!=NULL&&m_pNode!=Addr)
{
m_pNode=m_pNode->pNext;
index++;
}
if(m_pNode==NULL)
{
printf("链表中无%x这个地址\n",Addr);
return -1;
}
return index;
}
template
int CList::GetValue(int index)
{
if(index<0)
{
printf("Not in List\n");
return -666666;
}
m_pNode=m_pList->pNext;
for(int i=0;ipNext;
return m_pNode->Elt;
}
template
void CList::quick_sort(Position Head,Position Tail)
{
if(Head->pNext!=Tail&&Head->pNext->pNext!=Tail)
{
Position KeyP=Head->pNext; //指向存key值内存单元的指针
Position LP=Head; //比key值小的游标指针,KeyP的左边
Position RP=KeyP; //比key值大的游标指针,KeyP的右边
Position IncP=KeyP->pNext; //遍历单链表的游标指针,每次移动一位
while(IncP!=Tail)
{
if(IncP->EltElt)
LP=LP->pNext=IncP;
else
RP=RP->pNext=IncP;
IncP=IncP->pNext;
}
LP->pNext=KeyP; //将小于Key值的子链表衔接
RP->pNext=Tail; //将大于Key值的子链表衔接
//递归
quick_sort(Head,KeyP); //比Key小的子链表排序
quick_sort(KeyP,Tail); //比Key大的子链表排序
//注Head和Tail是不参与排序的,只起表头和表尾标识作用,故原链表的Tail值为NULL
}
}
template
void CList::QuickSort(int begin,int end)
{
Position Head=Index2Addr(begin-1);
Position Tail=Index2Addr(end+1);
quick_sort(Head,Tail);
}
//打印数组
template
void CList::PrintArray(T *Ay,int Size)
{
int i=0;
while(i List;
List.Print();
printf("===============数组转换为链表===============\n");
int array[6]={2,3,4,1,6,7};
int size=sizeof(array)/sizeof(array[0]);
List.Array2List(array,size);
List.Print();
printf("===============删除7===============\n");
List.Delete(7);
List.Print();
printf("===============插入111,123===============\n");
List.Insert(111);
List.Insert(123);
List.Print();
printf("===============快速排序===============\n");
List.QuickSort(0,List.GetSize()-1);
// List.quick_sort(List.GetAddr(-1),NULL);
List.Print();
printf("===============查找4前一个节点的数===============\n");
int index=List.FindPrevious(123);
cout<