单向循环链表的建立、插入和删除操作 C
时间: 2024-10-10 11:07:13 浏览: 30
单向链表结点的逐个删除-C语言教程
单向循环链表是一种特殊的链表结构,其中每个节点只包含一个指向下一个节点的指针,而最后一个节点的指针指向第一个节点,形成一个环形结构。下面是单向循环链表的基本操作:
**建立单向循环链表:**
1. 定义一个链表节点结构,包括数据域data和指向下一个节点的指针next。
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
```
2. 创建链表时,可以初始化一个头节点head,其next指向自身形成环。
```c
Node* createCircularList() {
Node* head = (Node*)malloc(sizeof(Node));
head->data = 0; // 或者初始化其他值
head->next = head; // 设置成循环链表
return head;
}
```
**插入操作:**
1. 首先判断是否需要插入到头部,如果新元素是链表的第一个节点,直接替换头结点。
2. 否则找到尾节点并插入。假设要插入的位置指针为current,插入位置为nextPos。
```c
void insertAtEnd(Node* head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = head->next; // 新节点的next指向当前尾部
if (head == head->next) { // 如果是空链表或只有一个节点
head->next = newNode; // 新节点成为新的头结点
} else {
Node* current = head;
while (current->next != head) { // 找到尾部
current = current->next;
}
current->next = newNode; // 将新节点连接到尾部
}
}
```
**删除操作:**
1. 删除指定节点的操作比较复杂,因为需要同时处理头节点的情况。
2. 使用两个指针,一个prev用于遍历到待删除节点的前一个,另一个curr用于找到待删除节点。
```c
void deleteNode(Node* head, int targetValue) {
Node* prev = NULL;
Node* curr = head;
if (curr != NULL && curr->data == targetValue) {
// 如果要删除的是头节点,更新头指针
head = curr->next;
free(curr);
return;
}
while (curr != NULL && curr->data != targetValue) {
prev = curr;
curr = curr->next;
}
if (curr == NULL) {
printf("Node not found.\n"); // 节点未找到
return;
}
prev->next = curr->next; // 删除节点
free(curr); // 释放内存
}
```
阅读全文