双链表功能:
1.创建一个双链表:CreatList
a.头插法 CreatList b.尾插法CreatList2
2.实现双链表的展示链表所有元素功能:DispList
3.实现双链表中元素插入功能:ListInsert
4.实现双链表中元素删除功能:ListDelet
#include<iostream>
using namespace std;
//双链表;
typedef int Elemtype;
typedef struct DNode{
Elemtype data;
struct DNode *prior;
struct DNode *next;
}DLinkNode; //使用typedef关键字为结构体DNode定义了一个新的名称DLinkNode(1)
//建立双链表;头插法;注意有无头节点
void CreatList(DLinkNode *&L,Elemtype a[],int n){
DLinkNode *s;
L=(DLinkNode*)malloc(sizeof(DLinkNode));
L->prior=L->next=NULL;
for(int i=0;i<n;i++){
s=(DLinkNode*)malloc(sizeof(DLinkNode));//接(1),如果不使用typedef的话要写为
//s=(struct DNode*)malloc(sizeof(struct DNode));
s->data=a[i];
s->next=L->next;
if(L->next!=NULL){
L->next->prior=s;//L不为空,修改L->next的前驱指针;
}
L->next=s;
s->prior=L;
}
}
//创建单链表尾插法,注意有无头节点
void CreatList2(DLinkNode *&L,Elemtype a[],Elemtype n){
DLinkNode *s,*r;
L=(DLinkNode*)malloc(sizeof(DLinkNode));
L->prior=L->next=NULL;
r=L;
for(int i=0;i<n;i++){
s=(DLinkNode*)malloc(sizeof(DLinkNode));
s->data=a[i];
r->next=s,s->prior=r; //将s插入到r之后;
r=s; //r指向尾结点;
}
r->next=NULL;
}
//展示链表元素;
void DispList(DLinkNode *L){
DLinkNode *s=L->next;
while(s!=NULL){
printf("%d ",s->data);
s=s->next;
}
}
//双链表插入元素,插入到序号为i的元素后面;注意有无头节点
void ListInsert(DLinkNode *&L,int i,Elemtype e){
DLinkNode *s=(DLinkNode*)malloc(sizeof(DLinkNode));
s->data=e;
DLinkNode *p=L;
Elemtype j=0;
while(p!=NULL&&j<i){
j++;
p=p->next;
}
if(p!=NULL&&j==i){
s->next=p->next;
if(p->next!=NULL){
p->next->prior=s;;//当p->next == NULL时,不能执行p->next->prior = s;
//因为p->next为空指针,无法访问其成员。
}
p->next=s;
s->prior=p;
}
}
//删除在链表中序号为3的元素,注意创建链表是从序号为0开始创建的,序号为三则为链表中第四个元素
//但是在尾插法中则是删除第三个 元素,尾插法无头节点;
void ListDelet(DLinkNode *&L,Elemtype i){
int j=0;
DLinkNode *p=L;
while(p->next!=NULL&&j<i){
p=p->next;
j++;
}
if(p->next!=NULL&&j==i){
p->next->next->prior=p->next;
p->next=p->next->next;
}
}
int main()
{
DLinkNode *L1=NULL;
Elemtype arr[]={1,2,3,4,5,6};
CreatList2(L1,arr,sizeof(arr)/sizeof(arr[0]));
ListInsert(L1,5,99);
DispList(L1);
ListDelet(L1,3);
cout<<"\n";
DispList(L1);
}