双向链表的建立,打印,查找,增删
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <climits>
using namespace std;
struct dnode {
int data;
dnode* left;
dnode* right;
dnode() {
data = 0;
left = right = nullptr;
}
dnode(int d)
{
data = d;
left = right = nullptr;
}
};
dnode* append_node(dnode* head, int data)
{
dnode* node = new dnode(data);
dnode* p = head, *q=nullptr;
while (p != nullptr)
{
q = p;
p = p->right;
}
q->right = node;
node->left = q;
return head;
}
dnode* creat_list()
{
dnode* head = new dnode(0);
for (int i = 1; i < 10; i++)
{
head=append_node(head, i);
}
return head;
}
int get_length(dnode* head)
{
int cnt = 0;
dnode* pnode = head;
while (pnode != nullptr)
{
cnt++;
pnode = pnode->right;
}
return cnt;
}
void print_list(dnode* head)
{
dnode* pnode = head;
if (head == nullptr)
return;
while (pnode != nullptr)
{
printf("%d ", pnode->data);
pnode = pnode->right;
}
printf("\n");
}
dnode* find_node(dnode* head, int data)
{
dnode* pnode = head;
if (head == nullptr)
return nullptr;
while ( pnode->data != data)
{
if(pnode->right != nullptr)
pnode=pnode->right;
}
return pnode;
}
void insert_node(dnode* node, int data)
{
dnode* newnode = new dnode(data);
if (node->right == nullptr)
{
node->right = newnode;
newnode->left = node;
}
else
{
newnode->right = node->right;
node->right->left = newnode;
node->right = newnode;
newnode->left = node;
}
}
dnode* delete_node(dnode* head, int data)
{
dnode* ptmp = nullptr;
dnode* pnode = find_node(head, data);
if (pnode == nullptr)
return nullptr;
else if (pnode->left == nullptr)
{
head = pnode->right;
if (head != nullptr)
{
head->left = nullptr;
}
}
else if (pnode->right == nullptr)
{
pnode->left->right = nullptr;
}
else
{
pnode->left->right = pnode->right;
pnode->right->left = pnode->left;
}
return head;
}
int main() {
cout << "begin\n";
dnode* head=creat_list();
cout << "list length: " << get_length(head)<<endl;
print_list(head);
cout << "寻找特定节点:" << endl;
dnode* p = find_node(head, 4);
print_list(p);
cout << "在特定节点后插入一节点13" << endl;
insert_node(p, 13);
print_list(head);
cout << "删除特定的节点13" << endl;
head=delete_node(head, 13);
print_list(head);
}