链表相信大家都不陌生,它是一种线性表。链表存储是很麻烦的,但是它也有好处,例如它可以插入或删除数据,能够释放空间,这些是数组做不到的。下面是双向链表代码。
首先一些准备:
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;
}
//看了我的代码就点个赞呗,不多,就一个赞!