用c语言实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素操作;用插入法建立带头结点的单循环链表;设计一个测试主函数验证所设计单循环链表的正确性。
时间: 2024-10-16 18:18:30 浏览: 57
C语言单循环链表的表示与实现实例详解
在C语言中,我们可以使用结构体来表示链表节点,并通过指针链接它们。这里是一个简单的示例,展示了如何实现单循环链表的基本操作:
1. **初始化**:
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
// 初始化链表为空
void initCircularList(Node** head) {
*head = NULL;
}
```
2. **求数据元素个数**:
```c
int countNodes(Node* head) {
if (head == NULL) return 0;
int count = 1; // 带头节点被视为1个元素
Node* current = head->next;
while (current != head) {
count++;
current = current->next;
}
return count;
}
```
3. **插入**:
```c
void insertNode(Node** head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = *head;
*head = newNode;
if (*head == head->next) { // 如果新节点就是头结点,形成循环
newNode->next = newNode;
}
}
```
4. **删除**:
```c
void deleteNode(Node** head) {
if (*head == NULL) return;
if (*head == head->next) { // 如果只有一个节点,删除它并返回
free(*head);
*head = NULL;
return;
}
Node* temp = *head;
while (temp->next != *head) {
temp = temp->next;
}
temp->next = *head; // 将最后一个节点的next指向头节点,断开循环
free(temp); // 删除最后一个节点
}
```
5. **取数据元素**:
```c
int getData(Node* head) {
if (head == NULL) return -1; // 空链表无数据
return head->data;
}
```
6. **带头结点的单循环链表插入**:
```c
void createCircularList(Node** head, ...) {
Node* first = (Node*)malloc(sizeof(Node));
first->data = 0; // 或者你想设置的初始值
first->next = first;
*head = first;
// 使用varargs接收插入值
va_list args;
va_start(args, head);
int value;
while ((value = va_arg(args, int)) != -1) {
insertNode(head, value);
}
va_end(args);
}
```
7. **测试主函数**:
```c
#include <stdio.h>
int main() {
Node* listHead = NULL;
createCircularList(&listHead, 1, 2, 3, 4, -1); // 添加终止符
printf("Elements in the circular list: %d\n", countNodes(listHead));
int data;
while ((data = getData(listHead)) != -1) {
printf("%d ", data);
}
deleteNode(&listHead);
if (countNodes(listHead) == 0) {
printf("\nDeletion successful. List is empty.\n");
} else {
printf("\nError: Deletion failed. List still has elements.\n");
}
return 0;
}
```
在这个主函数中,我们首先创建了一个包含一些整数的循环链表,然后检查它的元素个数、打印数据并尝试删除所有节点,最后确认列表是否已清空。
阅读全文