typedef struct node
{
int data;
node *pre;
node *next;
}node;
node* Create(); // 创建链表
int length(node *head); // 计算链表的长度
void print(node *head); // 链表的打印
node* search_node(node* head, int pos); // 链表节点的查找,从0开始,0返回head节点
bool insert_node(node* head, int pos, int data); // 在第pos个节点之后插入节点
bool delete_node(node* head, int pos); // 删除第pos个节点
node* Create() // 创建链表
{
cout << "======================Create()=====================" << endl;
node* head = (node*)malloc(sizeof(node));
assert(head != NULL);
head->data = -1;
head->pre = NULL;
bool isFirst = true; // 是否为第一个节点
node* p = head;
node* q = NULL;
int temp;
while (cin >> temp)
{
if (temp == 0)
{
break;
}
p = (node*)malloc(sizeof(node));
assert(p != NULL);
p->data = temp;
if (isFirst)
{
isFirst = false;
head->next = p;
p->pre = head;
}
else
{
q->next = p;
p->pre = q;
}
q = p;
}
p->next = NULL;
return head;
}
int length(node *head) // 计算链表的长度
{
cout << "==========================length()==========================" << endl;
int count = 0;
node* p = head->next;
while (p != NULL)
{
count++;
p = p->next;
}
return count;
}
void print(node *head) // 链表的打印
{
cout << "==========================print()==========================" << endl;
node* p = head->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
node* search_node(node* head, int pos) // 链表节点的查找,从0开始,0返回head节点
{
cout << "==========================search_node()==========================" << endl;
if (pos < 0)
{
return NULL;
}
int count = 0;
node* p = head;
while (p != NULL)
{
if (count == pos)
{
return p;
}
count++;
p = p->next;
}
return NULL;
}
bool insert_node(node* head, int pos, int data) // 在第pos个节点之后插入节点
{
cout << "==========================insert_node()==========================" << endl;
if (pos < 0)
{
return false;
}
node* p = search_node(head, pos);
if (p != NULL) // p是尾节点或者中间节点
{
node* q = (node*)malloc(sizeof(node));
assert(q != NULL);
q->data = data;
q->next = p->next; // 节点q插入到p节点后面
if (p->next != NULL)
{
p->next->pre = q;
}
p->next = q;
q->pre = p;
return true;
}
return false;
}
bool delete_node(node* head, int pos) // 删除第pos个节点,pos不能为0
{
cout << "==========================delete_node()==========================" << endl;
if (pos <= 0)
{
return false;
}
node* p = search_node(head, pos); // 记录第pos个节点
if (p != NULL) // 删除节点P
{
if (p->next != NULL)
{
p->next->pre = p->pre;
p->pre->next = p->next;
}
else //删除尾节点
{
p->pre->next = NULL;
}
delete p;
p = NULL;
return true;
}
return false;
}