简单实现双向链表的初始化 插入 搜索 删除元素

本文详细解析了双向链表的基本操作,包括插入、删除等,并提供了具体的代码实现。通过实例演示了如何在链表开头插入元素,以及如何删除特定值或位置的节点,最后输出链表的所有元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里实现下双向链表,感觉比单向的简单,以后都这样写好了。

题目大概是这样的:

首先输入命令总数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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值