一个双端链表(LinkedList)

LinkedListTest.c

#include "LinkedList.h"
#include <stdio.h>

void Traverse(LinkedList* list)
{
    for (Begin(list); HasNext(list); MoveNext(list))
        printf("%d ", *(int*)Current(list));
    putchar('\n');
}

void RTraverse(LinkedList* list)
{
    for (End(list); HasPrev(list); MovePrev(list))
        printf("%d ", *(int*)Current(list));
    putchar('\n');
}

int main(void)
{
    LinkedList* list = Create();
    int i;
    
    int array1[10];
    int array2[10];
    
    for (i = 0; i < 10; ++i) {
        array1[i] = i + 1;
        array2[i] = i + 10 + 1;
        AddBack(list, &array1[i]);
    }
    puts("1:");
    Traverse(list);
    RTraverse(list);
    printf("Size: %d\n", Size(list));
    
    AddBack(list, &array2[0]);
    puts("2:");
    Traverse(list);
    RTraverse(list);
    printf("Size: %d\n", Size(list));
    
    AddFront(list, &array2[1]);
    puts("3:");
    Traverse(list);
    RTraverse(list);
    printf("Size: %d\n", Size(list));
    
    RemoveBack(list);
    puts("4:");
    Traverse(list);
    RTraverse(list);
    printf("Size: %d\n", Size(list));
    
    RemoveFront(list);
    puts("5:");
    Traverse(list);
    RTraverse(list);
    printf("Size: %d\n", Size(list));
    
    Clear(list);
    for (i = 0; i < 10; ++i)
        AddFront(list, &array2[i]);
    puts("6:");
    Traverse(list);
    RTraverse(list);
    printf("Size: %d\n", Size(list));
    
    Destroy(list);
    return 0;
}
/*
1:
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
Size: 10
2:
1 2 3 4 5 6 7 8 9 10 11
11 10 9 8 7 6 5 4 3 2 1
Size: 11
3:
12 1 2 3 4 5 6 7 8 9 10 11
11 10 9 8 7 6 5 4 3 2 1 12
Size: 12
4:
12 1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1 12
Size: 11
5:
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
Size: 10
6:
20 19 18 17 16 15 14 13 12 11
11 12 13 14 15 16 17 18 19 20
Size: 10
*/

LinkedList.h

#ifndef LINKED_LIST_H
#define LINKED_LIST_H

typedef struct NodeTag       Node;
typedef struct LinkedListTag LinkedList;

struct NodeTag {
    Node* prev;     /* 前一个结点 */
    Node* next;     /* 后一个结点 */
    void* data;     /* 数据的指针 */
};

struct LinkedListTag {
    Node*    head;  /* 头结点 */
    Node*    tail;  /* 尾结点 */
    Node*    cur;   /* 当前结点 */
    int      size;  /* 链表大小 */
};

LinkedList* Create     (void);                         /* 创建一个链表,成功返回该链表的指针,否则返回NULL */
void        Destroy    (LinkedList* list);             /* 销毁一个链表,之后该链表便不能再使用 */
void        Clear      (LinkedList* list);             /* 清空链表中的所有元素 */
int         IsEmpty    (LinkedList* list);             /* 如果当前链表为空则返回非0,否则返回0 */
int         Size       (LinkedList* list);             /* 获得链表的大小(元素总个数) */
void        Begin      (LinkedList* list);             /* 将当前位置移动到链表的开始 */
void        End        (LinkedList* list);             /* 将当前位置移动到链表的最后 */
void        MoveNext   (LinkedList* list);             /* 将当前位置向后移动一个位置 */
void        MovePrev   (LinkedList* list);             /* 将当前位置向前移动一个位置 */
int         HasNext    (LinkedList* list);             /* 如果当前位置之后还有元素则返回非0,否则返回0 */
int         HasPrev    (LinkedList* list);             /* 如果当前位置之前还有元素则返回非0,否则返回0 */
void*       Current    (LinkedList* list);             /* 返回当前位置的元素 */
int         AddBack    (LinkedList* list, void* data); /* 将元素添加到链表末尾,成功返回非0,否则返回0 */
int         AddFront   (LinkedList* list, void* data); /* 将元素添加到链表前端,成功返回非0,否则返回0 */
void*       RemoveBack (LinkedList* list);             /* 将元素从末端移除并返回该元素,如果链表为空则返回NULL */
void*       RemoveFront(LinkedList* list);             /* 将元素从前端移除并返回该元素,如果链表为空则返回NULL */

#endif /* LINKED_LIST_H */

LinkedList.c

#include "LinkedList.h"
#include <stdlib.h>

#ifndef NULL
#define NULL ((void*)0)
#endif

/* 创建一个链表,成功返回该链表的指针,否则返回NULL */
LinkedList* Create(void)                         
{
    LinkedList* list = (LinkedList*)malloc(sizeof(LinkedList));
    if (!list) return NULL;
    
    list->head = NULL;
    list->tail = NULL;
    list->cur  = NULL;
    list->size = 0;
    
    return list;
}

/* 销毁一个链表,之后该链表便不能再使用 */
void Destroy(LinkedList* list)
{
    Clear(list);
    free(list);
}

/* 清空链表中的所有元素 */
void Clear(LinkedList* list)
{
    while (RemoveBack(list)) ;
}

/* 如果当前链表为空则返回非0,否则返回0 */
int IsEmpty(LinkedList* list)
{
    return list->size == 0;
}

/* 获得链表的大小(元素总个数) */
int Size(LinkedList* list)
{
    return list->size;
}

/* 将当前位置移动到链表的开始 */
void Begin(LinkedList* list)
{
    list->cur = list->head;
}

/* 将当前位置移动到链表的最后 */
void End(LinkedList* list)
{
    list->cur = list->tail;
}
/* 将当前位置向后移动一个位置,成功返回非0,否则返回0 */
void MoveNext(LinkedList* list)
{
    list->cur = list->cur->next;
}

/* 将当前位置向后移动一个位置,成功返回非0,否则返回0 */
void MovePrev(LinkedList* list)
{
    list->cur = list->cur->prev;
}

/* 如果当前位置之后还有元素则返回非0,否则返回0 */
int HasNext(LinkedList* list)
{
    if (!list->cur) return 0;
    if (list->cur == list->tail) return 1;
    return list->cur->next != NULL;
}

/* 如果当前位置之前还有元素则返回非0,否则返回0 */
int HasPrev(LinkedList* list)
{
    if (!list->cur) return 0;
    if (list->cur == list->head) return 1;
    return list->cur->prev != NULL;
}

/* 返回当前位置的元素 */
void* Current(LinkedList* list)
{
    return list->cur->data;
}

/* 将元素添加到链表末尾,成功返回非0,否则返回0 */
int AddBack(LinkedList* list, void* data)
{
    Node* node = (Node*)malloc(sizeof(Node));
    if (!node) return 0;
    
    node->data = data;
    if (list->tail) {
        list->tail->next = node;
        node->prev       = list->tail;
        node->next       = NULL;
    } else {
        node->next = NULL;
        node->prev = NULL;
        list->head = node;
    }
    list->tail = node;
    
    return ++list->size;
}

/* 将元素添加到链表前端,成功返回非0,否则返回0 */
int AddFront(LinkedList* list, void* data)
{
    Node* node = (Node*)malloc(sizeof(Node));
    if (!node) return 0;
    
    node->data = data;
    if (list->head) {
        list->head->prev = node;
        node->next       = list->head;
        node->prev       = NULL;
    } else {
        node->next = NULL;
        node->prev = NULL;
        list->tail = node;
    }
    list->head = node;
    
    return ++list->size;
}

/* 将元素从末端移除并返回该元素,如果链表为空则返回NULL */
void* RemoveBack(LinkedList* list)
{
    Node* temp;
    void* data;
    
    if (!list->size) return NULL;
    
    temp = list->tail;
    data = list->tail->data;
    
    if (list->head == list->tail) {
        list->head = NULL;
        list->tail = NULL;
        list->cur  = NULL;
    } else {
        list->tail       = list->tail->prev;
        list->tail->next = NULL;
    }
    --list->size;
    free(temp);
    
    return data;
}

/* 将元素从前端移除并返回该元素,如果链表为空则返回NULL */
void* RemoveFront(LinkedList* list)
{
    Node* temp;
    void* data;
    
    if (!list->size) return NULL;
    
    temp = list->head;
    data = list->head->data;
    
    if (list->head == list->tail) {
        list->head = NULL;
        list->tail = NULL;
        list->cur  = NULL;
    } else {
        list->head       = list->head->next;
        list->head->prev = NULL;
    }
    --list->size;
    free(temp);
    
    return data;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值