将单链表中终端结点的指针由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)。
为了使空链表与非空链表处理一致,我们通常会设置一个头结点。循环链表带有头结点的空链表如下图所示:
循环链表和单链表的主要差异在于循环的判断条件上,单链表是判断 p -> next 是否为空,而循环链表则是 p -> next 不等于头头结点,则循环未结束。
typedef struct Node {
int data;
struct Node *next;
} node;
单循环链表的创建
void Create() {
node *newNode;
newNode = (node *)malloc(sizeof(node));
printf("\n输入节点数值 : ");
scanf("%d", &newNode->data);
newNode->next = NULL;
if(rear == NULL) {
front = rear = newNode;
} else {
rear->next = newNode;
rear = newNode;
}
rear->next = front;
}
单循环链表的遍历
void Traverse() {
temp = front;
if(front == NULL) {
printf("\n🈳️");
} else {
printf("\n");
for(; temp != rear; temp = temp->next) {
printf("\n%d address=%u next=%u\t",temp->data,temp,temp->next);
}
printf("\n%d address=%u next=%u\t",temp->data,temp,temp->next);
}
}
单循环链表的删除
void Delete() {
temp = front;
if(front == NULL) {
printf("\nUnderflow :");
} else {
if(front == rear) {
printf("\n%d", front->data);
front = rear = NULL;
} else {
printf("\n%d", front->data);
front = front->next;
rear->next = front;
}
temp->next = NULL;
free(temp);
}
}