#include <iostream>
using namespace std;
typedef int ElmType;
const int length=10;
typedef struct node
{
ElmType i;
struct node* next;
struct node* back;
}Node;
typedef Node* pNode;
void init(pNode&,int); //初始化双链表
bool traverse(pNode); //前后遍历双链表
void insert(pNode&,int); //在节点p后插入
void del(pNode&); //删除节点p
void collect_space(pNode head);
void main()
{
pNode head,p; //生成一个未初始化的Node类型头指针
init(head,length);//建立双向链表,其中包括初始化head指针
p=head->next->next;
insert(p,1);
traverse(head); //遍历
getchar(); //按任意键退出
collect_space(head); //收回链表空间
}
void init(pNode &head,int max_num)
{
head=(Node*)malloc(sizeof(Node));
head->i=0;
head->back=NULL;
head->next=NULL;
Node *p,*temp;
p=head;
for(int i=1;i<max_num;i++)
{
temp=(Node*)malloc(sizeof(Node));
temp->i=i;
temp->back=p;
temp->next=NULL;
p->next=temp;
p=temp;
}
}
bool traverse(pNode head)
{
if(head==NULL)
{
cout<<"输入的head为空"<<endl;
return false;
}
while(head!=NULL)
{
cout<<head->i<<" ";
head=head->next;
}
return true;
}
void del(pNode &p)
{
if(p==NULL)
{
cout<<"你输入的指针为空"<<endl;
return;
}
Node *temp=p;
if(p->next==NULL)
{
//如果删除的是尾指针,那么删除p后,p所指向位置自动前移一位
if(p->back==NULL)
{
cout<<endl<<"链表已清空"<<endl;
free(p);
p=NULL;
return;
}
else
{
p=temp->back;
p->next=NULL;
free(temp);
}
}
else if(p->back==NULL)
{
//如果删除的是头指针,那么删除p后,p所指向位置向后移一位
p=temp->next;
p->back=NULL;
free(temp);
}
else
{
//如果删除的是中间位置的,那么删除p后,p指向位置向前移一位
p=temp->next;
temp->back->next=p;
p->back=temp->back;
free(temp);
}
}
void insert(pNode &p,int n)
{
if(p==NULL)
{
cout<<"链表为空!"<<endl;
return;
}
pNode temp=(pNode)malloc(sizeof(Node));
temp->i=n;
if(p->next==NULL)
{
p->next=temp;
temp->next=NULL;
temp->back=p;
}
else
{
temp->next=p->next;
temp->back=p;
p->next->back=temp;
p->next=temp;
}
}
void collect_space(pNode head)
{
while(head!=NULL)
{
del(head);
}
}
双向链表的源码实现
最新推荐文章于 2022-11-21 19:32:08 发布