创建的是一个带头的双向链表,结构如下
typedef int LTDataType;
typedef struct ListNode {
struct ListNode* prev;
struct ListNode* next;
LTDataType data;
}LTNode;
链表的实现如下
#include"List.h"
LTNode* BuyLTNode(LTDataType x) {
LTNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));
if (newnode == NULL) {
perror("malloc fail");
}
newnode->prev = NULL;
newnode->next = NULL;
newnode->data = x;
}
LTNode* InitNode() {
LTNode* phead = BuyLTNode(-1);
phead->prev = phead;
phead->next = phead;
return phead;
}
void LTPushBack(LTNode* phead, LTDataType x) {
assert(phead);
/*LTNode* newnode = BuyLTNode(x);
LTNode* tail = phead->prev;
tail->next = newnode;
newnode->prev = tail;
newnode->next = phead;
phead->prev = newnode;*/
LTInsert(phead,x);
}
void LTPopBack(LTNode* phead) {
assert(phead);
assert(phead->next != phead);
/*LTNode* tail = phead->prev;
LTNode* tailPrev = tail->prev;
tailPrev->next = phead;
phead->prev = tailPrev;
free(tail);
tail = NULL;*/
LTEarse(phead->prev);
}
void LTPushFront(LTNode* phead, LTDataType x) {
assert(phead);
/*LTNode* newnode = BuyLTNode(x);
newnode->next = phead->next;
newnode->prev = phead;
phead->next->prev = newnode;
phead->next = newnode;*/
LTInsert(phead->next, x);
}
void LTPopFront(LTNode* phead) {
assert(phead);
assert(phead->next != phead);//判断为空
/*LTNode* frist = phead->next;
phead->next = frist->next;
frist->next->prev = phead;
free(frist);
frist = NULL;*/
LTEarse(phead->next);
}
void LTPrint(LTNode* phead) {
LTNode* cur = phead->next;
while (cur!=phead)
{
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
LTNode* LTFind(LTNode* phead, LTDataType x) {
assert(phead);
LTNode* cur = phead->next;
while (cur != phead) {
if (cur->data == x) {
return cur;
}
cur = cur->next;
}
return NULL;
}
//在pos位置之前插入一个链表
void LTInsert(LTNode* pos, LTDataType x) {
assert(pos);
LTNode* prev = pos->prev;
LTNode* newnode = BuyLTNode(x);
//prev newnode pos
prev->next = newnode;
newnode->prev = prev;
newnode->next = pos;
pos->prev = newnode;
}
//在pos位置删除一个链表
void LTEarse(LTNode* pos) {
assert(pos);
LTNode* prevnode = pos->prev;
prevnode->next = pos->next;
pos->next->prev = prevnode;
free(pos);
pos = NULL;
}
//判断链表是否为空
bool LTEmpty(LTNode* phead) {
return phead->next == phead;
}
//链表里面的个数
size_t LTSize(LTNode* phead) {
assert(phead);
LTNode* cur = phead->next;
size_t size = 0;
while (cur!=phead) {
++size;
cur = cur->next;
}
}
//链表的销毁
void LTDestory(LTNode* phead) {
assert(phead);
LTNode* cur = phead->next;
LTNode* next = cur->next;
while (cur != phead) {
free(cur);
cur = next;
next = next->next;
}
free(phead);
}