用c语言写一段代码1. 实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素等操作; 2. 用插入法建立带头结点的单循环链表; 3. 设计一个测试主函数验证所设计单循环链表的正确性。 4. 用单循环链表解决一个实际问题。
时间: 2024-10-08 11:10:34 浏览: 83
在C语言中,我们可以创建一个简单的单循环链表结构体来实现上述功能。这里是一个基础的实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点
typedef struct Node {
int data;
struct Node* next;
} Node;
// 初始化链表
Node* initList() {
Node* head = (Node*)malloc(sizeof(Node));
if (!head) {
printf("Memory allocation failed.\n");
return NULL;
}
head->next = head; // 设置环形结构
head->data = -1; // 通常头节点设特殊值表示空链表
return head;
}
// 求链表元素个数
int countNodes(Node* head) {
int count = 0;
Node* temp = head;
while (temp != head->next) {
count++;
temp = temp->next;
}
return count;
}
// 插入节点
void insertNode(Node** head, int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed.\n");
return;
}
newNode->data = value;
newNode->next = (*head)->next;
(*head)->next = newNode;
}
// 删除节点(仅支持删除最后一个节点)
void deleteLastNode(Node** head) {
if (*head == NULL || (*head)->next == *head) {
printf("Cannot delete from empty or circular list.\n");
return;
}
Node* last = *head;
while (last->next != *head) {
last = last->next;
}
free(last);
*head = last->next;
}
// 取数据元素
int getData(Node* head) {
if (head == head->next) {
printf("List is empty or contains only one element.\n");
return -1; // 或者抛出异常
}
return head->data;
}
// 主测试函数
int main() {
Node* list = initList();
// 测试插入
insertNode(&list, 5);
insertNode(&list, 10);
// 打印并验证长度
printf("Number of elements: %d\n", countNodes(list));
// 删除最后一个元素
deleteLastNode(&list);
// 再次打印确认删除效果
printf("After deletion: ");
for (Node* temp = list; temp != list->next; temp = temp->next)
printf("%d ", temp->data);
printf("\n");
// 获取并检查数据
int value = getData(list);
if (value != -1)
printf("First element: %d\n", value);
else
printf("Error: Unable to get first element.\n");
free(list); // 释放内存
return 0;
}
```
这个代码实现了单循环链表的基本操作,包括初始化、插入、删除和获取数据元素。注意,这里的删除操作只针对循环链表的尾部,其他情况需要额外处理。
阅读全文