双向链表的结构定义:
typedef struct DuLNode{
struct DuLNode *prior; // 指向前趋
ElemType data;
struct DuLNode *next; // 指向后继
}DuLNode,*DuLinkList;
双向链表中的基本操作
1、双向链表的初始化
// 1、初始化
Status InitDuLinkList(DuLinkList &L){
L=new DuLNode;
L->prior = NULL;
L->next = NULL;
return OK;
}
2、在带头结点的双向链表L中查找第i个元素,返回结点的地址
//2、在带头结点的双向链表L中查找第i个元素,返回结点的地址
DuLNode *GetElemP_DuL(DuLinkList L, int i){
int j;
DuLNode *p;
p = L->next;
j = 1;
while(j<i && p){
p = p->next;
++j;
}
return p;
}
3、求表长
int LengthDuLinkList(DuLinkList &L){
int i = 0;
DuLNode *p;
p = L->next;
while(p){
i++;
p = p->next;
}
return i;
}
4、双向链表第i个结点前插入新结点
// 4、双向链表第i个结点前插入新结点
Status InsertDuLinkList(DuLinkList &L,int i,ElemType e){
DuLNode *p,*s;
if(!(p = GetElemP_DuL(L,i))){
return ERROR;
}
s = new DuLNode;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return OK;
}
5、删除
// 5、删除第i个结点
Status DeleteDuLinkList(DuLinkList &L,int i) {
DuLNode *p;
if(!(p = GetElemP_DuL(L,i))){
return ERROR;
}
p->prior->next = p->next;
p->next->prior = p->prior;
delete p;
return OK;
}
6、利用尾插法建立双向链表
// 6、利用尾插法建立双向链表
void CreateList_L(DuLinkList &L,int n){
L=new DuLNode;
L->next=NULL;
L->prior=NULL;
DuLNode *p,*r;
r=L;//尾指针r指向头结点
for(int i=0;i<n;++i){
p=new DuLNode;//生成新结点
scanf(&p->data);
p->next=NULL;
p->prior=r;
r->next=p; //插入到表尾
r=p;//r指向新的尾结点
}
}
汇总:
#include <stdio.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef char ElemType;
typedef struct DuLNode{
struct DuLNode *prior; // 指向前趋
ElemType data;
struct DuLNode *next; // 指向后继
}DuLNode,*DuLinkList;
// 1、初始化
Status InitDuLinkList(DuLinkList &L){
L=new DuLNode;
L->prior = NULL;
L->next = NULL;
return OK;
}
//2、在带头结点的双向链表L中查找第i个元素,返回结点的地址
DuLNode *GetElemP_DuL(DuLinkList L, int i){
int j;
DuLNode *p;
p = L->next;
j = 1;
while(j<i && p){
p = p->next;
++j;
}
return p;
}
// 3、双向链表第i个结点前插入新结点
Status InsertDuLinkList(DuLinkList &L,int i,ElemType e){
DuLNode *p,*s;
if(!(p = GetElemP_DuL(L,i))){
return ERROR;
}
s = new DuLNode;
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return OK;
}
// 4、删除第i个结点
Status DeleteDuLinkList(DuLinkList &L,int i) {
DuLNode *p;
if(!(p = GetElemP_DuL(L,i))){
return ERROR;
}
p->prior->next = p->next;
p->next->prior = p->prior;
delete p;
return OK;
}
// 5、求双向链表的表长
int LengthDuLinkList(DuLinkList &L){
int i = 0;
DuLNode *p;
p = L->next;
while(p){
i++;
p = p->next;
}
return i;
}
//
// 6、利用尾插法建立双向链表
void CreateList_L(DuLinkList &L,int n){
L=new DuLNode;
L->next=NULL;
L->prior=NULL;
DuLNode *p,*r;
r=L;//尾指针r指向头结点
for(int i=0;i<n;++i){
p=new DuLNode;//生成新结点
scanf(&p->data);
p->next=NULL;
p->prior=r;
r->next=p; //插入到表尾
r=p;//r指向新的尾结点
}
}
int main(){
DuLinkList L;
InitDuLinkList(L);
// 创建双向链表
CreateList_L(L,1);
// 1、求表长
int leng = LengthDuLinkList(L);
printf("表长为:%d\n",leng);
// 2、插入元素求表长
int result1 = InsertDuLinkList(L,1,'A');
int result2 = InsertDuLinkList(L,2,'b');
int leng2 = LengthDuLinkList(L);
printf("双向链表结点插入是否成功:%d\n",result1);
printf("双向链表结点插入是否成功:%d\n",result2);
printf("表长为:%d\n",leng2);
// 3、删除元素求表长
int deleten = DeleteDuLinkList(L,1);
int leng3 = LengthDuLinkList(L);
printf("双向链表结点删除是否成功:%d\n",deleten);
printf("表长为:%d\n",leng3);
return 0;
}