在这里实现下双向链表,感觉比单向的简单,以后都这样写好了。
题目大概是这样的:
首先输入命令总数n,然后输入命令和数字,
命令有这些:
insert x:在链表开头添加含有键值x的结点(也就是head与下一个结点之间)
delete x:删除第一个含有键值x的结点
deleteFirst:删除链表的表头结点
deleteLast:删除链表的表尾结点
所有命令执行完后,顺次输出链表的键值(如图方向),相邻键值之间用1个空格隔开。
输入:
7
insert 5
insert 2
insert 3
insert 1
delete 3
insert 6
delete 5
输出:
6 1 2
然而以下代码在vs2012是过不去的,只能在devc++上用,谁知道为什么不行- -
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
struct Node{
int a;
Node *prev,*next;
};
Node *head;
//双向链表其实是圆形的,尾结点接头结点
void init(){//创建头结点
head=(Node*)malloc(sizeof(Node));
head->next=head;
head->prev=head;
}
void insert(int d){//在头节点后面添加元素
Node *p=(Node *)malloc(sizeof(Node));
//都不指到里面,都是直接指向整体
p->a=d;
head->next->prev=p;
p->next=head->next;
p->prev=head;
head->next=p;
}
Node* search(int key){//在链表中搜索key这个数
Node *c;
c=head->next;
while(c!=head&&c->a!=key)
{
c=c->next;
}
return c;
}
void deleteNode(Node* k){//删除结点
if(k==head)return;
k->prev->next=k->next;
k->next->prev=k->prev;
free(k);
}
//删除head后的第一个结点
void deletefirst()
{
deleteNode(head->next);
}
//删除head前的结点
void deletelast(){
deleteNode(head->prev);
}
void deletesearch(int key){
deleteNode(search(key));
}
//打印链表;
void print(){
Node *k;
k=head->next;
while(k!=head)
{
cout<<k->a<<" ";
k=k->next;
}
}
int main(){
int n,key,i;
char com[200];
cin>>n;
init();
for(i=0;i<n;i++)
{
scanf("%s",com);
cin>>key;
if(com[0]=='i'){
insert(key);
}
else {
if(strlen(com)>6)
{
if(com[6]=='F')
deletefirst();
if(com[6]=='L')deletelast();
}else deletesearch(key);
}
}
print();
}