循环单链表
循环单链表和单链表的区别在于,表中的最后一个结点的指针不是NULL,而改为指向头结点,从而整个链表形成一个环。
循环单链表可以从表中任意一个结点开始遍历整个链表。不仅可以设置头指针,还可设置尾指针,对于表头与表尾进行操作都只需要O(1)的时间复杂度
循环单链表中结点类型的描述如下:
typedef struct RNode {
ElemType data;
RNode* next;
}RNode, * RLinkList;
初始化链表:
RLinkList InitList(RLinkList& L) {
if (L == NULL) {
return NULL;
}
L = new RNode;
L->next = L;
return L;
}
头插法建立链表
RLinkList HeadInsert(RLinkList& L) {
cout << "采用头插法建立循环单链表:" << endl;
int x;
cin >> x;
while (x != 9999) {
RNode* s = new RNode;
s->data = x;
s->next = L->next;
L->next = s;
cin >> x;
}
return L;
}
尾插法建立链表
RLinkList TailInsert(RLinkList& L) {
cout << "采用尾插法建立循环单链表:" << endl;
int x;
cin >> x;
RNode* q = L;
while (x != 9999) {
RNode* s = new RNode;
s->data = x;
s->next = q->next;
q->next = s;
q = s;
cin >> x;
}
return L;
}
按值查找操作
int LocateElem(RLinkList L, ElemType e) {
RNode* s = new RNode;
s = L->next;
int i = 1;
while (s->data != e && s != L) {
s = s->next;
i++;
}
if (s == L) {
return NULL;
}
else {
return i;
}
}
按位查找操作
ElemType GetElem(RLinkList L, int i) {
RNode* s = new RNode;
s = L->next;
int j = 1;
while (j < i - 1&&s!=L) {
s = s->next;
j++;
}
if (i == 1) {
return s->data;
}
return s->next->data;
}
插入操作
bool InsertList(RLinkList& L, int i, ElemType e) {
if (i < 1) {
return false;
}
int j = 1;
RNode* s = new RNode;
RNode* p = new RNode;
s = L->next;
while (j < i - 1 && s != L) {
s = s->next;
j++;
}
p->data = e;
p->next = s->next;
s->next = p;
return true;
}
删除操作
bool ListDelete(RLinkList& L, int i, ElemType& e) {
if (i < 1) {
return false;
}
RNode* s, * p;
int j = 1;
s = L->next;
while (i < j - 1 && s->next != L) {
s = s->next;
j++;
}
p = s->next;
if (p == L) {
return false;
}
e = p->data;
s->next = p->next;
free(p);
return true;
}
遍历
void PrintList(RLinkList L) {
RNode* s = new RNode;
s = L->next;
while (s != L) {
cout << s->data << "\t";
s = s->next;
}
cout << endl;
}
销毁表
bool DestoryList(RLinkList& L) {
if (L->next == L) {
return true;
}
RNode* s = new RNode;
while (L->next != L) {
s = L->next;
L->next = s->next;
free(s);
}
return true;
}
表中元素个数
int Length(RLinkList L) {
RNode* s = L;
int i = 0;
while (s->next != L) {
s = s->next;
i++;
}
return i;
}