C++ 双向链表

链表相信大家都不陌生,它是一种线性表。链表存储是很麻烦的,但是它也有好处,例如它可以插入或删除数据,能够释放空间,这些是数组做不到的。下面是双向链表代码。

首先一些准备:

struct Node{
	int data;
	Node *pre,*next;
}*r,*p,*s;

接下来就是最基本的建立双向链表和给双向链表赋值:

void creat(Node *head){
	int x;
	cin>>x;
	r=head;
	while(x!=-1){
		p=new Node;
		p->next=NULL;
		p->data=x;
		r->next=p;
		p->pre=r;
		r=p;
		cin>>x;
	}
}

输出链表内数据:

void print(Node *head){
	p=head->next;
	while(p!=NULL){
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}

插入链表项:

void insert(Node *head,int i,int x){
	p=head->next;
	int j=1;
	while(p!=NULL and j<i){
		p=p->next;
		j++;
	}
	if(p->next!=NULL){
		s=new Node;
		s->data=x;
		s->next=p;
		s->pre=p->pre;
		p->pre->next=s;
		p->pre=s;
	}else{
		cout<<"第"<<i<<"项找不出来\n";
	}
}

删除链表项:

void del(Node *head,int i){
	p=head->next;
	int j=1;
	while(p!=NULL and j<i){
		p=p->next;
		j++;
	}
	if(p!=NULL){
		if(p->next==NULL){
			p->pre->next=NULL;
		}else{
			p->pre->next=p->next;
			p->next->pre=p->pre;
		}
		free(p);
	}else{
		cout<<"第"<<i<<"项找不出来\n";
	}
}

完整代码:

#include<bits/stdc++.h>
using namespace std;
struct Node{
	int data;
	Node *pre,*next;
}*r,*p,*s;
void creat(Node *head){            //输入
	int x;
	cin>>x;
	r=head;
	while(x!=-1){
		p=new Node;
		p->next=NULL;
		p->data=x;
		r->next=p;
		p->pre=r;
		r=p;
		cin>>x;
	}
}
void insert(Node *head,int i,int x){    //插入
	p=head->next;
	int j=1;
	while(p!=NULL and j<i){
		p=p->next;
		j++;
	}
	if(p->next!=NULL){
		s=new Node;
		s->data=x;
		s->next=p;
		s->pre=p->pre;
		p->pre->next=s;
		p->pre=s;
	}else{
		cout<<"第"<<i<<"项找不出来\n";
	}
}
void del(Node *head,int i){       //删除
	p=head->next;
	int j=1;
	while(p!=NULL and j<i){
		p=p->next;
		j++;
	}
	if(p!=NULL){
		if(p->next==NULL){
			p->pre->next=NULL;
		}else{
			p->pre->next=p->next;
			p->next->pre=p->pre;
		}
		free(p);
	}else{
		cout<<"第"<<i<<"项找不出来\n";
	}
}
void print(Node *head){             //输出
	p=head->next;
	while(p!=NULL){
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}
int main(){
	Node *h;
	h=new Node;         //建立一个空间h
	creat(h);           //输入
	insert(h,2,100);    //传入h 插入第几项 插入什么
	print(h);           //输出
	del(h,5);           //传入h 删除第几项
	print(h);
	return 0;
}
//看了我的代码就点个赞呗,不多,就一个赞!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值