单向循环列表

1,476 阅读1分钟

将单链表中终端结点的指针由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(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);
    }
}