双向循环连链表的另类实现

`#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;

}`

posted on 2024-04-24 20:45  jjjkkklll  阅读(3)  评论(0编辑  收藏  举报

导航