带头结点双向循环链表
带头双向循环链表是什么
带头的双向循环链表是链表的链表数据结构的一种,链表有带头,不带头,双向和单向,而带头的双向循环链表是链表顺序结构最复杂的一种,但是它的结构和单向链表比较它的尾插和尾删更快,同时带头在尾插的时候不用考虑第一个插的数字为空的情况.
实现的过程
#include<iostream>
using namespace std;
typedef int q;
typedef struct dlist {
struct dlist* next;
struct dlist* prev;
q data;
}dlist;
dlist* init();//链表初始化
dlist* buylnode(int x);//创建新节点
void pushadd(dlist* head, int x);//尾插
void frontadd(dlist* head, int x);//头插
void frontdel(dlist* head);//头删
void pushdel(dlist* head);//尾删
void anaryadd(dlist* pos, int x);//任意位置的插入
void anarydel(dlist* pos);//在任意位置删除
dlist* finddlist(dlist* head, int x);//查找
void modify(dlist* head, int x);//修改
void print(dlist* head);//打印链表
bool ifempty(dlist* head);//是否为空
完整代码
dlist* init() {
dlist* q = new dlist;
q->next = q;
q->prev = q;
return q;
}
dlist* buylnode(int x) {
dlist* newlnode = new dlist;
newlnode->data = x;
newlnode->next = NULL;
newlnode->prev = NULL;
return newlnode;
}
void pushadd(dlist* head,int x) {
dlist* newlnode = buylnode(x);
dlist* tail = head->prev;
tail->next = newlnode;
newlnode->prev = tail;
newlnode->next = head;
head->prev = newlnode;
}
void frontadd(dlist* head, int x) {
dlist* newlnode = buylnode(x);
dlist* next = head->next;
newlnode->next = next;
next->prev = newlnode;
newlnode->prev = head;
head->next = newlnode;
}
void frontdel(dlist* head) {
dlist* next = head->next->next;
delete head->next;
head->next = next;
next->prev = head;
}
void pushdel(dlist*head){
dlist* tail = head->prev;
dlist* tailprev = tail->prev;
tailprev->next = head;
head->prev = tailprev;
delete tail;
}
void anaryadd(dlist* pos, int x) {
dlist* newlnode = buylnode(x);
dlist* prev = pos->prev;
prev->next = newlnode;
newlnode->prev = prev;
newlnode->next = pos;
pos->prev = newlnode;
}
void anarydel(dlist* pos) {
dlist* prev = pos->prev;
dlist* tail = pos->next;
delete pos;
prev->next = tail;
tail->prev = prev;
}
dlist* finddlist(dlist* head, int x) {
dlist* cur = head->next;
int i = 0;
while (cur) {
if (cur->data == x) {
return cur;//判断是否找到
}
else {
return NULL;//没找到
}
i++;//记录位置
cur = cur->next;
}
return NULL;
}
void modify(dlist* head, int x) {
if (finddlist(head, x) != NULL) {
dlist* cur = finddlist(head, x);
cur->data = x;
}
}
void print(dlist* head) {
dlist* cur = head->next;
while (head != cur) {
cout << cur->data;
cur=cur->next;
}
}
bool ifempty(dlist* head) {
return head->next == head;
}
int main() {
dlist* head = init();
frontadd(head, 8);
frontadd(head, 5);
frontadd(head, 6);
pushdel(head);
print(head);
return 0;
}