只带队尾指针的循环单链表
时间: 2023-07-12 17:45:09 浏览: 153
循环单链表是一种特殊的单链表,它的尾节点指向头节点,形成一个环形结构。如果只带有一个尾指针,那么可以通过该指针找到链表的尾部节点,但无法直接找到头节点。因此,在对循环单链表进行遍历、插入、删除等操作时需要特别注意。
对于一个只带队尾指针的循环单链表,可以通过如下方式进行初始化:
```c
typedef struct node {
int data;
struct node *next;
} Node;
Node *rear = NULL;
void init() {
rear = NULL;
}
```
插入操作可以分为两种情况,一种是插入到空链表中,另一种是插入到非空链表中。对于第一种情况,需要新建一个节点,并将其作为头节点和尾节点,然后将其指针域指向自身。对于第二种情况,只需要将新节点插入到尾节点的后面即可。
```c
void insert(int data) {
Node *p = (Node*)malloc(sizeof(Node));
p->data = data;
if (rear == NULL) { // 空链表
rear = p;
rear->next = rear;
} else { // 非空链表
p->next = rear->next;
rear->next = p;
rear = p;
}
}
```
删除操作同样需要考虑两种情况,一种是删除头节点,另一种是删除其他节点。对于第一种情况,需要判断链表是否为空,如果不为空,则将头节点指向其后面的节点,然后释放头节点的内存。对于第二种情况,需要找到要删除节点的前一个节点,然后将其指针域指向要删除节点的后一个节点,最后释放要删除节点的内存。
```c
void delete(int data) {
Node *p = rear->next;
Node *prev = rear;
if (rear == NULL) { // 空链表
printf("List is empty.\n");
return;
}
if (p->data == data) { // 删除头节点
rear->next = p->next;
free(p);
return;
}
while (p != rear) { // 删除其他节点
if (p->data == data) {
prev->next = p->next;
free(p);
return;
}
prev = p;
p = p->next;
}
if (p->data == data) { // 删除尾节点
prev->next = rear->next;
rear = prev;
free(p);
}
}
```
遍历操作可以通过一个循环实现,每次将指针指向下一个节点即可,直到指针指向尾节点为止。
```c
void traverse() {
Node *p = rear->next;
if (rear == NULL) { // 空链表
printf("List is empty.\n");
return;
}
while (p != rear) { // 遍历链表
printf("%d ", p->data);
p = p->next;
}
printf("%d\n", p->data);
}
```
以上就是只带队尾指针的循环单链表的实现方法。需要注意的是,由于链表是环形的,因此在遍历、插入、删除等操作时需要格外小心,以免出现死循环或者指针指向错误的情况。
阅读全文