在这里插入代码片#include <iostream>
using namespace std;
typedef int Elem;
typedef struct Node{
Elem data;
Elem index = -1;
struct Node* pre;
struct Node* next;
}node;
//初始化链表
node* initDoubleList()
{
node* head = (node*)malloc(sizeof(node));
if(head==NULL)
{
cout<<"开辟空间失败";
return NULL;
}
node* temp = head;
temp->next = NULL;
temp->pre = NULL;
}
//向链表表尾添加数据
void addNewNode(node* head,int elem)
{
node* temp = head;
while(temp->next!=NULL)
{
temp = temp->next;
}
node* newNode = (node*)malloc(sizeof(node));
newNode->data = elem;
newNode->next = NULL;
newNode->pre = temp;//新节点的pre域,指向尾节点
temp->next = newNode;//尾节点的next域,指向新节点
}
//根据下标插入
void addNewNodeByIndex(node* head,int pos,int elem)
{
node* temp = head;
//找到待插入节点位置
for(int i=0;i<pos;i++)
{
temp = temp->next;
}
//创建新节点,为新节点赋值
node* newNode = (node*)malloc(sizeof(node));
newNode->data = elem;
/*
无论是Java实现还是C/C++实现,都需要理解下列步骤,顺序不能改变,可以作图理解
S1:先让新节点的pre域指向,待插入结点的前一个节点 newNode->pre = temp
S2:新节点的next域指向,待插入位置的下一个节点 newNode->next = temp->next
S3:上一个节点的next域指向新节点,完成插入 temp->next = newNode
*/
newNode->pre = temp;
newNode->next = temp->next;
temp->next = newNode;
}
//删除指定位置节点
void deleteNodeByIndex(node* head,int pos){
node* temp = head;
for(int i=0;i<pos;i++)
{
temp = temp->next;
}
node* delNode = temp->next;
temp->next->pre = temp;
temp->next = temp->next->next;
free(delNode);
}
//删除给定值节点
void deleteNodeByValue(node* head,int value)
{
node* temp = head;
while(temp->next!=NULL)
{
temp = temp->next;
if(temp->data==value)
break;
}
node* delNode = temp;
temp->next->pre = temp->pre;
temp->pre->next = temp->next;
free(delNode);
}
//打印链表
void showDoubleList(node* head)
{
node* temp = head;
while(temp->next!=NULL)
{
temp = temp->next;
cout<<temp->data<<endl;
}
}
int main()
{
//初始化链表
node* head = initDoubleList();
//向表尾插入节点
addNewNode(head,5);
addNewNode(head,4);
showDoubleList(head);
//指定位置插入
cout<<"--------------"<<endl;
addNewNodeByIndex(head,0,9);
addNewNodeByIndex(head,2,15);
showDoubleList(head);
//删除指定位置节点
cout<<"--------------"<<endl;
deleteNodeByIndex(head,0);
showDoubleList(head);
//删除给定值
cout<<"--------------"<<endl;
deleteNodeByValue(head,15);
showDoubleList(head);
}
由于多次插入的调用,所以文字会有重复