数据结构——循环链表和企业链表
循环链表
单链表只能从头结点开始遍历整个链表,若希望从任意结点开始遍历整个链表,则需要用循环链表,即首尾相接。
循环链表的插入和删除操作,如下:
设置结点结构体:
struct LinkNode
{
LinkNode* Next;
int data;
};
设置链表类:
class LinkList
{
public:
LinkList();
void Insert_LinkList(int pos,int value);
void Removepos_LinkList(int pos);
void Remove_LinkList(int value);
int GetSize_LinkList();
int Find_LinkList(int value);
void Free_LinkList();
void Print_LinkList();
void inverse();
~LinkList();
LinkNode* head;
int size;
};
1.初始化
注意:初始化时头结点的下一个结点是它自身 this->head->Next = this->head;
LinkList::LinkList()
{
this->head = new LinkNode;
this->head->Next = this->head;
this->size = 0;
}
2.插入
void LinkList::Insert_LinkList(int pos, int value)
{
if (pos<0 || pos > this->size)
{
cout << "位置插入有误" << endl;
}
LinkNode* newP = new LinkNode;
newP->data = value;
newP->Next = NULL;
LinkNode* pCurrent = this->head;
for (int i = 0; i < pos; i++)
{
pCurrent = pCurrent->Next;
}
newP->Next = pCurrent->Next;
pCurrent->Next = newP;
this->size++;
}
3.按位置删除
void LinkList::Removepos_LinkList(int pos)
{
if (pos<0 || pos > this->size)
{
cout << "位置插入有误" << endl;
}
LinkNode* pCurrent = this->head;
for (int i = 0; i < pos; i++)
{
pCurrent = pCurrent->Next;
}
LinkNode* Delep = pCurrent->Next;
pCurrent->Next = Delep->Next;
this->size--;
}
4.按元素删除
void LinkList::Remove_LinkList(int value)
{
LinkNode* pCurrent = this->head->Next;
int idx = 0;
for (int i = 0; i < this->size; i++)
{
if (pCurrent->data==value)
{
break;
}
idx++;
pCurrent = pCurrent->Next;
}
Removepos_LinkList(idx);
}
5.寻找
int LinkList::Find_LinkList(int value)
{
LinkNode* pCurrent = this->head->Next;
int idx = 0;
int flag = -1;
for (int i = 0; i < this->size; i++)
{
if (pCurrent->data == value)
{
flag = idx;
break;
}
idx++;
pCurrent = pCurrent->Next;
}
return flag;
}
6.打印
void LinkList::Print_LinkList()
{
LinkNode* pCurrent = this->head->Next;
for (int i = 0; i < this->size*3; i++)
{
if (pCurrent==this->head)
{
pCurrent = pCurrent->Next;
}
cout << pCurrent->data << " ";
pCurrent = pCurrent->Next;
if ((i+1)%this->size==0)
{
cout << endl;
}
}
cout << endl;
}
7.逆置
void LinkList::inverse()
{
LinkNode* temp;
LinkNode* p = this->head->Next;
head->Next = this->head;
while (p!=this->head)
{
temp = p->Next;
p->Next = this->head->Next;
head->Next = p;
p = temp;
}
}
8.释放
void LinkList::Free_LinkList()
{
LinkNode* pCurrent = this->head->Next;
LinkNode* temp;
while (pCurrent!=this->head)
{
temp = pCurrent->Next;
delete pCurrent;
pCurrent = temp;
}
this->head->Next = this->head;
this->size = 0;
cout << "The LinkList has empty!" << endl;
}
企业链表
可以储存各种元素类型,同时,不需要修改来链表的结构
企业链表的结点只有指针域,没有数据域。数据域是挂载指针域下面的。
同样头结点为空节点。
定义结点结构体
struct LinkNode
{
LinkNode* next;
};
定义数据域结构体
struct MyData
{
LinkNode node;
int value;
};
此处定义为int类型,使用时可定义其他类型,或自定义数据类型
定义企业链表类
class LinkList
{
public:
LinkList();
void Insert_LinkList(int pos, LinkNode* data);
void Remove_LinkList(int pos);
int Find_LinkList(MyData* data);
int GetSize_LinkList();
void Print_LinkList();
MyData* Front_LinkList();
//void Free_LinkList();
~LinkList();
LinkNode* head;
int size;
};
1.插入
void LinkList::Insert_LinkList(int pos, LinkNode* data)
{
if (pos<0||pos>this->size)
{
pos = this->size;
}
LinkNode* pCurrent = this->head;
for (int i = 0; i < pos; i++)
{
pCurrent = pCurrent->next;
}
data->next = pCurrent->next;
pCurrent->next = data;
this->size++;
}
2.删除
void LinkList::Remove_LinkList(int pos)
{
if (this->head->next==NULL)
{
std::cout << "链表为空" << std::endl;
}
if (pos<0 || pos>this->size)
{
std::cout << "删除位置错误" << std::endl;
}
LinkNode* pCurrent = this->head;
for (int i = 0; i < pos; i++)
{
pCurrent = pCurrent->next;
}
LinkNode* Delep = pCurrent->next;
pCurrent->next = Delep->next;
this->size--;
}
3.查找
int LinkList::Find_LinkList(MyData* data)
{
if (this->head->next == NULL)
{
std::cout << "链表为空" << std::endl;
}
LinkNode* pCurrent = this->head->next;
int idx = 0;
int flag = -1;
while (pCurrent!=NULL)
{
if (data==(MyData*)pCurrent)
{
flag = idx;
break;
}
idx++;
}
return flag;
}
4.打印
void LinkList::Print_LinkList()
{
LinkNode* pCurrent = this->head->next;
if (pCurrent == NULL)
{
std::cout << "链表为空" << std::endl;
}
while (pCurrent != NULL)
{
MyData* p = (MyData*)pCurrent;
std::cout << p->value << " ";
pCurrent = pCurrent->next;
}
}