用c语言创建一个带头节点的单向循环链表,用以存储数组,且存储位置在尾部,最后先打印再释放
时间: 2024-11-27 17:08:13 浏览: 18
在C语言中,我们可以使用结构体来表示链表节点,并定义一个函数来实现带头结点的单向循环链表。首先,我们需要定义一个结构体`Node`,包含数据域和指向下一个节点的指针:
```c
typedef struct Node {
int data; // 存储数组元素
struct Node* next; // 指向下个节点
} Node;
```
接着,我们创建一个全局变量`head`作为链表的头节点,并初始化它:
```c
// 创建带头结点的链表
Node* createList(int arr[], int n) {
Node* head = (Node*)malloc(sizeof(Node)); // 分配内存
if (!head) {
printf("Memory allocation failed.\n");
return NULL;
}
head->data = arr[n - 1]; // 将数组最后一个元素存入头节点
head->next = head; // 设置循环链接
for (int i = n - 2; i >= 0; i--) { // 从第二个元素开始遍历数组
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed.\n");
break; // 如果分配失败就退出
}
newNode->data = arr[i];
newNode->next = head->next; // 新节点的next指向前一个节点
head->next = newNode; // 更新头节点的next指向新节点
}
return head;
}
```
接下来,我们编写一个函数来打印链表并释放内存:
```c
void printAndFreeList(Node* head) {
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
// 释放链表节点内存
Node* temp = head;
while (temp != NULL) {
Node* nextTemp = temp->next;
free(temp); // 释放当前节点
temp = nextTemp;
}
}
```
现在你可以按照下面的方式使用这个链表:
```c
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
Node* listHead = createList(arr, n);
if (listHead) {
printAndFreeList(listHead);
}
return 0;
}
```
阅读全文