设计循环单链表,实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素等操作;设计一个测试主函数验证所设计单循环链表的正确性
时间: 2024-09-24 22:02:14 浏览: 42
list-2_单链表_speakgfp_数据结构_循环链表_
设计一个循环单链表(Circular Singly Linked List),首先需要定义节点结构体,包含数据域(data)和指针域(next)。在C语言中,我们可以这样做:
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
// 初始化循环单链表
Node* initializeCircularList() {
Node* head = NULL;
return head; // 如果链表为空,返回空指针
}
// 求数据元素个数
int countElements(Node* head) {
if (head == NULL) return 0;
int count = 1;
Node* current = head->next;
while (current != head) {
count++;
current = current->next;
}
return count;
}
// 插入操作,假设要在链表头部插入
void insertAtHead(Node** head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = *head;
(*head)->next = newNode;
if (*head == newNode) *head = newNode; // 如果新节点就是头节点,则形成循环
}
// 删除操作,这里以删除头部节点为例
void deleteHead(Node** head) {
if (*head == NULL) return;
Node* temp = *head;
*head = (*head)->next;
free(temp);
// 如果链表只剩下一个元素并是环形,需要调整头节点
if (*head == temp) *head = NULL;
}
// 取数据元素
int getData(Node* head) {
if (head == NULL) return -1; // 空链表处理
return head->data;
}
// 测试主函数
int main() {
Node* list = initializeCircularList();
// 插入一些元素
insertAtHead(&list, 1);
insertAtHead(&list, 2);
insertAtHead(&list, 3);
// 验证链表长度
printf("元素个数: %d\n", countElements(list));
// 取数据并打印
printf("第一个元素: %d\n", getData(list));
// 删除某个元素并验证
deleteHead(&list);
printf("删除后元素个数: %d\n", countElements(list));
return 0;
}
```
阅读全文