链表的种类有很多,单链表是不带头不循环单向链表,但双链表是带头循环双向链表,并且双链表还有一个哨兵位,哨兵位不是头节点
typedef int LTDataType;typedef struct ListNode{struct ListNode* next; //指针保存下⼀个结点的地址struct ListNode* prev; //指针保存前⼀个结点的地址LTDataType data;}LTNode;
//创建链表,创建关于x的链表
LTNode* buyNode(LTDataType x) {LTNode* node = (LTNode*)malloc(sizeof(LTNode));if (node == NULL) {perror("open fail!");exit(1);}node->data = x;node->next = node->prev = node;return node;
}//创建哨兵位
LTNode* LTInit()
{LTNode* phead = buyNode(-1);return phead;
}//打印双链表
void LTPrint(LTNode* phead) {LTNode* node = phead->next;while (node!=phead) {printf("%d ", node->data);node = node->next;}printf("\n");
}//尾插
void LTPushBack(LTNode* phead, LTDataType x) {assert(phead);LTNode* node = buyNode(x);node->next = phead;node->prev = phead->prev;phead->prev->next = node;phead->prev = node;
}//头插
void LTPushFront(LTNode* phead, LTDataType x) {assert(phead);LTNode* newnode = buyNode(x);newnode->prev = phead;newnode->next = phead->next;phead->next->prev = newnode;phead->next = newnode;
}//判空
bool LTEmpty(LTNode* phead)
{assert(phead);return phead->next == phead;
}尾删
void LTPopBack(LTNode* phead) {assert(!LTEmpty(phead));LTNode* del = phead->prev;del->prev->next = phead;phead->prev = del->prev;free(del);del = NULL;
}//头删
void LTPopFront(LTNode* phead) {assert(!LTEmpty(phead));LTNode* del = phead->next;del->next->prev = phead;phead->next = del->next;free(del);del = NULL;
}//查询节点
LTNode* LTFind(LTNode* phead, LTDataType x) {assert(phead);LTNode* pcur = phead->next;while (pcur != phead){if (pcur->data == x){return pcur;}pcur = pcur->next;}return NULL;
}//在pos位置之后插⼊数据
void LTInsert(LTNode* pos, LTDataType x) {assert(pos);LTNode* node = buyNode(x);LTNode* del = pos->next;node->next = del;node->prev = pos;pos->next = node;del->prev = node;
}//删除pos位置的结点
void LTErase(LTNode* pos)
{assert(pos);pos->next->prev = pos->prev;pos->prev->next = pos->next;free(pos);pos = NULL;
}//销毁链表
void LTDesTroy(LTNode* phead)
{LTNode* pcur = phead->next;while (pcur != phead){LTNode* next = pcur->next;free(pcur);pcur = next;}free(phead);phead = NULL;
}