一、双向链表结点结构体
typedef struct node
{
int data;
struct node *pre;
struct node *next;
}Node;
指针指向的是什么东西,指针就是什么类型。这里要有指向前一个结点的指针也需要一个指向后面结点的指针,每个结点都是struct node类型的结构体。
二、双向链表结构体
typedef struct DoubleList
{
Node* head;
Node* tail;
int size;
}DoubleList;
双向链表结构体中要定义头结点、尾结点以及链表长度。
三、创建结点
Node* creat_node(int data)
{
Node* node=(Node*)malloc(sizeof(Node))
node->data = data;
node->pre = NULL;
node->next = NULL;
}
四、遍历链表
void show_list(DoubleList* list)
{
Node* node=list->head ;
for(int i=0;i<list->size ;i++)
{
cout<<node->data;
node=node->next ;
}
}
五、插入头结点
void push_head(DoubleList* list,int data)
{
Node* new_node = creat_node(data);
if(list->size == 0)
{
list->head = new_node;
list->tail = new_node;
}
else
{
new_node->next=list->head ;
list->head->pre = new_node;
}
list->size ++;
}
六、插入尾结点
void push_tail(DoubleList *list,int data)
{
Node* new_node = creat_node(data)
if(list->size == 0)
{
list->head = new_node;
list->tail = new_node;
}
else
{
list->tail->next = new_node;
new_node->pre = list->tail ;
list->tail = new_node ;
}
list->size ++;
}
七、在任意位置插入结点
bool insert_node(DoubleList *list,int index,int data)
{
//插入的位置超出链表范围
if(index<0 || index>list->size ) return false;
if(index==0)
{
push_head(list,data);
return true;
}
else if(index==list->size)
{
push_tail(list,data);
return true;
}
Node *tmp=NULL;
if(index<=list->size /2)
{
tmp=list->head ;
for(int i=0;i<index-1;i++) tmp=tmp->next ;
}
else
{
tmp = list->tail;
for(int i=0;i<list->size -index;i++) tmp=tmp->pre ;
}
Node* new_node=creat_node(data);
tmp->next->pre = new_node;
new_node->next = tmp->next;
tmp->next = new_node;
new_node->pre = tmp;
list->size ++;
return true;
}
总结:其他操作类似,主要是要掌握指针的写法,然后模拟过程。