1.简介
双链表 是什么?
有指向前驱节点和后继节点的指针的链表
2.双链表的基本实现(分区)
双链表结构体
typedef struct DNode{
ElemType data;
struct DNode *prior;//指向前驱节点
struct DNode *next;//指向后继节点
}DLinkNode;
1.头插法建立双链表
关键步骤
代码实现:
//1.头插法建立双链表
void CreateListF(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));
s->data=a[i];
s->next=L->next;
if(L->next!=NULL)
L->next->prior=s;
L->next=s;
s->prior=L;
}
}
2.尾插法建立双链表
关键步骤:
代码实现:
//2.尾插法建立双链表
void CreateListR(DLinkNode *&L,ElemType a[],int n){
DLinkNode *s,*r;
L=(DLinkNode*)malloc(sizeof(DLinkNode));//创建头节点
r=L;//r--始终指向尾节点,开始时指向头节点
for(int i=0;i<n;i++){
s=(DLinkNode*)malloc(sizeof(DLinkNode));
s->data=a[i];//创建数据节点s
r->next=s;//将s节点插入到 r结点之后
s->prior=r;
r=s;//r指向尾节点
}
r->next=NULL;
}
3.在双链表种插入元素
关键代码:
代码实现:
//3.在第i个结点插入元素
bool ListInsert(DLinkNode *&L,int i,ElemType){
int j=0;
DLinkNode *p=L,*s;
if(i<=0) return false;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL) return false;
else {
s=(DLinkNode *)malloc(sizeof(DLinkNode));
s->data==e;
s->next=p->next;
if(p->next!=NULL)
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
}
4.删除第i个结点
代码实现:
//4.删除第i个结点。
bool ListDelete(DLinkNode *&L,int i,ElemType e){
int j=0;
DLinkNode *p=L,*q;
if(i<=0) return false;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL) return false;
else {
q=p->next;
if(q==NULL)
return false;
e=q->data;
p->next=q->next;
if(q->next!=NULL)
q->next->prior=p;
free(q);
return true;
}
}
3.双链表的其他运算
4.所有代码:
#include <maolloc.h>
#include <stdio.h>
typedef int ElemType;
typedef struct DNode{
ElemType data;
struct DNode *prior;//指向前驱节点
struct DNode *next;//指向后继节点
}DLinkNode;
//1.头插法建立双链表
void CreateListF(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));
s->data=a[i];
s->next=L->next;
if(L->next!=NULL)
L->next->prior=s;
L->next=s;
s->prior=L;
}
}
//2.尾插法建立双链表
void CreateListR(DLinkNode *&L,ElemType a[],int n){
DLinkNode *s,*r;
L=(DLinkNode*)malloc(sizeof(DLinkNode));//创建头节点
r=L;//r--始终指向尾节点,开始时指向头节点
for(int i=0;i<n;i++){
s=(DLinkNode*)malloc(sizeof(DLinkNode));
s->data=a[i];//创建数据节点s
r->next=s;//将s节点插入到 r结点之后
s->prior=r;
r=s;//r指向尾节点
}
r->next=NULL;
}
//3.在第i个结点插入元素
bool ListInsert(DLinkNode *&L,int i,ElemType){
int j=0;
DLinkNode *p=L,*s;
if(i<=0) return false;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL) return false;
else {
s=(DLinkNode *)malloc(sizeof(DLinkNode));
s->data==e;
s->next=p->next;
if(p->next!=NULL)
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
}
//4.删除第i个结点。
bool ListDelete(DLinkNode *&L,int i,ElemType e){
int j=0;
DLinkNode *p=L,*q;
if(i<=0) return false;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL) return false;
else {
q=p->next;
if(q==NULL)
return false;
e=q->data;
p->next=q->next;
if(q->next!=NULL)
q->next->prior=p;
free(q);
return true;
}
}