带头双向链表功能实现

ListNode.h
#include<stdio.h>
#include<assert.h>
typedef int DataType;
typedef struct ListNode
{
DataType _data;
struct ListNode* _last;
struct ListNode* _next;
}ListNode;
typedef struct List
{
ListNode* head;
}List;
ListNode* CreatListNode(DataType x);//创建节点
void ListNodeInit(List* list);//初始化
void ListPushFront(List* list, DataType x);//头插
void ListPushBack(List* list, DataType x);//尾插
void ListPopFront(List* list);//头删
void ListPopBack(List* list);//尾删
void ListInsert(List* list,ListNode* pos, DataType x);//在pos前插入
void ListErase(List* list, List* pos);//删除pos节点;
void ListDestory(List* List);//销毁链表
void ListPrint(List* list);//打印链表

ListNode.c
#include"ListNode.h"
//创建节点
ListNode* CreatListNode(DataType x) {
 ListNode* NewListNode = (ListNode*)malloc(sizeof(ListNode));
 NewListNode->_data = x;
 NewListNode->_last = NULL;
 NewListNode->_next = NULL;
 return NewListNode;
}
//初始化
void ListNodeInit(List* list) {
 assert(list);
 list->head = CreatListNode(0);
 list->head->_last = list->head;
 list->head->_next = list->head;
}
//头插
void ListPushFront(List* list, DataType x) {
 assert(list);
 /ListNode NewNode = CreatListNode(x);
 ListNode* cur = list->head->_next;
 NewNode->_next = cur;
 cur->_last = NewNode;
 list->head->_next = NewNode;
 NewNode->_last = list->head;/
 ListInsert(list, list->head->_next, x);
}
//尾插
void ListPushBack(List
list,DataType x) {
 assert(list);
 /ListNode NewNode = CreatListNode(x);
 ListNode* Tail=list->head->_last;
 Tail->_next = NewNode;
 NewNode->_last = Tail;
 NewNode->_next = list->head;
 list->head->_last = NewNode;/
 ListInsert(list, list->head, x);
}
//头删
void ListPopFront(List
list) {
 assert(list);
 /ListNode Tail = list->head->_next;
 list->head->_next = Tail->_next;
 Tail->_next->_last = list->head;
 free(Tail);/
 ListErase(list, list->head->_next);
}
//尾删
void ListPopBack(List
list) {
 assert(list);
 /ListNode cur = list->head->_last;
 cur->_last->_next = list->head;
 list->head->_last = cur->_last;
 free(cur);/
 ListErase(list, list->head->_last);
}
//在pos前进行插入
void ListInsert(List
list,ListNode* pos, DataType x) {
 assert(list&&pos);
 ListNode* Tail = pos->_last;
 ListNode* NewNode = CreatListNode(x);
 Tail->_next = NewNode;
 NewNode->_last = Tail;
 NewNode->_next = pos;
 pos->_last = NewNode;
}
//删除pos节点
void ListErase(List* list, ListNode* pos) {
 assert(list && pos);
 ListNode* Tail = pos->_next;
 ListNode* cur = pos->_last;
 Tail->_last = cur;
 cur->_next = Tail;
 free(pos);
}
//销毁链表
void ListDestory(List* list) {
 assert(list);
 ListNode* cur = list->head->_next;
 while (cur != list->head) {
  ListNode* NewNode = cur->_next;
  free(cur);
  cur = NewNode;
 }
 free(list->head);
}
//打印
void ListPrint(List* list) {
 assert(list);
 ListNode* cur = list->head->_next;
 while (cur!=list->head) {
  printf("%d->", cur->_data);
  cur = cur->_next;
  
 }
}
void testList() {
 List list;
 ListNode* pos;
 ListNodeInit(&list);
 ListPushBack(&list, 1);
 ListPushBack(&list, 2);
 ListPushBack(&list, 3);
 ListPushBack(&list, 4);
 ListPushFront(&list, 0);
 ListPushFront(&list, -1);
 ListPushFront(&list, -2);
 ListPrint(&list);
}
int main() {
 testList();
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值