循环链表(带头节点)
(与单链表类似,只是尾结点的 next 指向头节点)
循环链表的结构如下:
1. 循环链表的结构体定义,代码如下
typedef struct CNode
{
int data;
struct CNode *next;
}CNode,*CList;
2. 循环链表的初始化,代码如下
void InitList(CList plist)
{
assert(plist !=NULL);
if(plist== NULL)
{
return ;
}
plist->next = plist;
}
3. 利用头插法进行插入,代码如下
//头插,违背生活规律,尽量少用
bool Insert_head(CList plist,int val)
{
CNode *p = (CNode *)malloc(sizeof(CNode));
p->data = val;
p->next = plist->next;
plist->next = p;
return true;
}
4. 利用尾插法插入,代码如下
bool Insert_tail(CList plist,int val)
{
CNode *p = (CNode *)malloc(sizeof(CNode ));
p->data = val;
CNode *q;
for(q=plist;q->next!=plist;q=q->next) ;
p->next = q->next;//p->next = plist;
q->next = p;
return true;
}
5. 按关键字进行查找,代码如下
CNode* Search(CList plist,int key)
{
for(CNode *p=plist->next;p!=plist;p=p->next)
{
if(p->data == key)
{
return p;
}
}
return NULL;
}
6. 按关键字进行删除,代码如下
bool Delete(CList plist,int key)
{
CNode *p;
for(p=plist;p->next!=plist;p=p->next)
{
if(p->next->data == key)
{
break;
}
}
if(p->next == plist)
{
return false;
}
CNode *q = p->next;
p->next = q->next;
free(q);
return true;
}
7. 求链表的长度,代码如下
int GetLength(CList plist)
{
int count = 0;
for(CNode *p=plist->next;p!=plist;p=p->next)
{
count++;
}
return count;
}
8. 判空,代码如下
bool IsEmpty(CList plist)
{
return plist->next == plist;
}
9. 清空链表,代码如下
void Clear(CList plist)
{
Destroy(plist);
}
10. 销毁链表,代码如下
void Destroy(CList plist)
{
CNode *p;
while(plist->next != plist)
{
p = plist->next;
plist->next = p->next;
free(p);
}
}