双向循环连链表的另类实现
`#include <stdio.h>
include <stdlib.h>
/**
- @file name: Untitled-1.c
- @brief 双向链表的另类实现
- @author 2492834335@qq.com
- @date 2024/04/24
- @version 1.0 :版本
- @property :属性介绍
- @note
- CopyRight (c) 2023-2024 2492834335@qq.com All Right Reseverd
*/
typedef struct cclist{
int data;
struct cclist *prev;
struct cclist *next;
} CClist;
/**
- @function name: Create_cclist
- @brief 根据一个给定的数组,建立一个另类的双向不循环链表
- @param
-
head :略
-
a : 给定的一个数组
-
size;数组元素的个数
- @retval void
- @date 2024/04/24
- @version 1.0 :版本
- @note 这个双向不循环链表是把新结点的前指针和后指针都指向链表头部,再把链表头部前指针指向新结点。
-
最后在新结点设为新的头部结点。和普通的结点头部结点不同的是,它的前指针指向下一个元素。
*/
void Create_cclist(CClist **head, int a[], int size){
CClist *new_node;
*head = NULL; // 初始化头部为NULL
for (int i = 0; i < size; i++) {
new_node = (CClist *)malloc(sizeof(CClist));
if(new_node == NULL){
perror("CREATE FAIL!");
exit(EXIT_FAILURE);
}
new_node->data = a[i];
new_node->prev = *head;
if(*head != NULL){
new_node->next = *head;
(*head)->prev = new_node;
} else {
new_node->next = NULL; // 如果是第一个节点,设置next为NULL
}
*head = new_node;
// 注意这里没有设置new->next->prev = new; 因为当i==size-1时,不会有next节点
}
}
void PrintList(CClist *head){
while(head != NULL){
printf("%d ", head->data);
head = head->next;
}
}
int main() {
int a[] = {3, 5, 2, 55, 33, 86, 33, 7, 3, 2};
// 获取数组大小
CClist *L = NULL; // 初始化为空指针
Create_cclist(&L, a, 10); // 使用&获取头部指针的地址
PrintList(L); // 打印链表内容
// 清理内存
CClist *temp;
while(L != NULL){
temp = L;
L = L->next;
free(temp);
}
return 0;
}`