首先,我们得定义结点:
双向链表需要前后两个指针,pre指向前一个元素,next指向后一个元素。
结点当然要保存数据key了,当然 key 也可以换成另外一个结构体,比如学生信息之类的。
初始化函数:我们定义一个里面不含实际数据的头节点,方便操作。注意这里用new而非malloc,如果键值是一个结构体,比如学生结构体,而且里面含有字符串类型,比如string name,那么如果这里申请空间用malloc,编译不会报错,但是运行时程序会崩溃。
接下来是插入函数:
插入函数主要四步,要切记顺序不要乱。
接下来是搜索函数:
搜索函数其实就是把整个链表遍历了一遍。
从头节点的下一个元素开始,
找到要搜索的元素或者回归到头节点时,搜索结束。
所以一般情况,程序都会先判断搜索函数返回的元素是不是头节点,然后再进行相应操作。
删除操作:
删除操作很简单,核心代码就两步,但是要注意,此时元素 t 只是无法从程序的逻辑上访问而已,元素 t 此时不仅占用空间,而且里面保存的数据依然还在内存中,所以,我们要进行释放操作:
接下来练练题:
https://vjudge.net/problem/Aizu-ALDS1_3_C
AC代码:
#include<iostream>
using namespace std;
struct Node
{
int key;
Node *pre,*next;
};
Node *head;
void init()
{
head=new Node();
head->next=head;
head->pre=head;
}
void insert(int key)
{
Node *x=new Node();
x->key=key;
//头插法
x->next=head->next;
head->next->pre=x;
head->next=x;
x->pre=head;
}
Node* search(int key)
{
Node *temp=head->next;
while(temp!=head&&temp->key!=key)
{
temp=temp->next;
}
return temp;
}
void deleteNode(Node *t)
{
if(t==head)return;
t->pre->next=t->next;
t->next->pre=t->pre;
delete t;
}
void deleteKey(int key)
{
deleteNode(search(key));
}
int main()
{
init();
int T;
cin>>T;
char op[15];
int key;
while(T--)
{
scanf("%s",op);
if(op[0]=='i')
{
scanf("%d",&key);
insert(key);
}
else if(op[6]=='F')
{
deleteNode(head->next);
}
else if(op[6]=='L')
{
deleteNode(head->pre);
}
else
{
scanf("%d",&key);
deleteNode(search(key));
}
}
Node *u=head->next;
printf("%d",u->key);
while(u->next!=head)
{
u=u->next;
printf(" %d",u->key);
}
cout<<endl;
return 0;
}