循环链表
循环单链表是在在单链表的基础上,用最后的一个结点的指针域指向头结点形成的。因此它在逻辑上是一个环形结构。
双向是一个节点有前驱和后驱。
结构定义
typedef struct List
{
int data;
struct List* prior;
struct List* nxet;
}CircularList;
创建头节点
CircularList* InitList()
{
CircularList* head;
head = (CircularList*)malloc(sizeof(CircularList));
head->nxet = head;
head->prior = NULL;
return head;
}
向链表插入数据(尾插法)
void ListInsert(CircularList* head, int data)
{
CircularList* p,*h;
h = head;
p = (CircularList*)malloc(sizeof(CircularList));
while (h->nxet != head)
{
h = h->nxet;
}
p->data = data;
h->nxet = p;
p->nxet = head; //最后一个指向头节点
p->prior = h; //
head->prior = p; //头节点前驱指向最后一个节点
}
打印数据(查看是否正确)
int Print(CircularList* head, int way)
{
CircularList* Hp, * Pp;
Hp = head->nxet;
Pp = head->prior;
if (head->nxet == head)
return 0;
if (way == 0) //顺序打印
{
while (Hp != head)
{
printf("%d\n", Hp->data);
Hp = Hp->nxet;
}
}
if (way == 1) //倒序打印
{
while (Pp != head)
{
printf("%d\n", Pp->data);
Pp = Pp->prior;
}
}
}
顺序打印是测试后驱,倒序是测试前驱。
测试循环,即把if中
Hp != head
改为:
Hp != NULL