双向链表之上篇

首先,我们得定义结点:

双向链表需要前后两个指针,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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值