双向循环链表的创建练习
include <stdio.h>
include <stdlib.h>
/**
- @file name: Untitled-1.c
- @brief 双向链表
- @author 2492834335@qq.com
- @date 2024/04/25
- @version 1.6 :版本
- @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;数组元素的个数
-
@date 2024/04/25
-
@version 1.6 :版本
-
@note 这个双向循环链表
-
*/
void Create_cclist(CClist **head, int a[], int size){*head = NULL; // 初始化头部为NULL
CClist tail;
tail=NULL;
// while(tail->next!=head){
// tail=tail->next;// }
for (int i = 0; i < size; i++) {
CClist* new_node = (CClist *)malloc(sizeof(CClist));
if(new_node == NULL){
perror("CREATE FAIL!");
exit(EXIT_FAILURE);
}new_node->data = a[i];
if (*head==NULL){
new_node->prev=new_node;
new_node->next=new_node;
*head=new_node;
tail=new_node;}
else{
new_node->prev=tail;
new_node->next=head;
tail->next=new_node;
(head)->prev=new_node;
tail = new_node;}
// new_node->prev = tail;
// tail->next=new_node;
// if(head != (head)->next){
// new_node->next = head;
// (head)->prev = new_node;
// } else {
// new_node->next = new_node; // 如果是第一个节点,设置next为NULL
// }
// *head = new_node;// 注意这里没有设置new->next->prev = new; 因为当i==size-1时,不会有next节点
//}
}}
void PrintList(CClist head){
CClist cur=head;
if(head != NULL){
do{
printf("%d ",cur->data);
cur=cur->next;
}while(cur!=head);
}
}
// void mergecclist(CClistl,CClistl2){
// (l2)->prev->prev=l;
// (l)->prev->next=l2;
// }
int main() {
int a[] = {3, 5, 2, 55, 33, 86, 33, 7, 3, 2};
// 获取数组大小
int b[]={3,5,3,555,666,777,888,999,111,222};
CClist *L = NULL; // 初始化为空指针
CClist *L2= NULL;
Create_cclist(&L, a, 10); // 使用&获取头部指针的地址
Create_cclist(&L2,a,10);
PrintList(L); // 打印链表内容
// 清理内存
return 0;
}