前言:最近复习数据结构,回归C++的怀抱~
代码环境:
Dev-C++ 5.11
定义:
typedef struct DNode
{
ElemType data; //数据域
struct DNode *prior, *next; //前驱和后继指针
} DNode , *DLinkList;
基本操作的实现:
/* 初始化双链表 */
bool InitDLinkList(DLinkList &L)
{
L = (DNode *) malloc (sizeof(DNode)); //分配一个头结点
if(L == NULL) //内存不足,分配失败
{
return false;
}
L -> prior = NULL;
L -> next = NULL;
return true;
}
/* 创建双链表 */
void CreateDLinkList(DLinkList &L,int n)
{
DNode *pnew,*ptemp;
ptemp = L;
if(n<0)
{
cout<<"输入的结点个数有误"<<endl;
exit(EXIT_FAILURE);
}
for(int i=0;i<n;i++)
{
pnew = new DNode;
cout<<"请输入第"<<i+1<<"结点的值:";
cin>> pnew -> data;
pnew -> next = NULL;
pnew -> prior = ptemp;
ptemp -> next = pnew ;
ptemp = pnew;
}
}
/* 遍历双链表 */
void TravelDLinkList(DLinkList L)
{
DNode *p;
p = L->next;
while(p != NULL)
{
cout<<"结点的值为"<<p->data <<endl;
p = p -> next;
}
}
/* 判空 */
bool Empty(DLinkList L)
{
if(L->next == NULL)
{
return true;
}
else
return false;
}
/* 插入后继结点 */
bool InsertNextDNode(DNode *p, DNode *s)
{
if(p == NULL || s == NULL)
{
return false;
}
s -> next = p ->next;
if(p -> next != NULL)
{
p->next->prior = s;
}
s->prior = p;
p->next =s;
return true;
}
/* 删除p结点的后继结点*/
bool DeleteNextDNode(DNode *p)
{
if(p == NULL)
return false;
DNode *q = p -> next;
if(q == NULL)
return false;
p -> next = q -> next;
if(q -> next != NULL)
q->next->prior = p;
free(q);
return true;
}
/* 删除链表 */
void DestoryList(DLinkList &L)
{
while(L->next != NULL)
{
DeleteNextDNode(L);
}
free(L);
L = NULL;
}
完整代码:
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct DNode
{
ElemType data; //数据域
struct DNode *prior, *next; //前驱和后继指针
} DNode , *DLinkList;
/* 初始化双链表 */
bool InitDLinkList(DLinkList &L)
{
L = (DNode *) malloc (sizeof(DNode)); //分配一个头结点
if(L == NULL) //内存不足,分配失败
{
return false;
}
L -> prior = NULL;
L -> next = NULL;
return true;
}
/* 创建双链表 */
void CreateDLinkList(DLinkList &L,int n)
{
DNode *pnew,*ptemp;
ptemp = L;
if(n<0)
{
cout<<"输入的结点个数有误"<<endl;
exit(EXIT_FAILURE);
}
for(int i=0;i<n;i++)
{
pnew = new DNode;
cout<<"请输入第"<<i+1<<"结点的值:";
cin>> pnew -> data;
pnew -> next = NULL;
pnew -> prior = ptemp;
ptemp -> next = pnew ;
ptemp = pnew;
}
}
/* 遍历双链表 */
void TravelDLinkList(DLinkList L)
{
DNode *p;
p = L->next;
while(p != NULL)
{
cout<<"结点的值为"<<p->data <<endl;
p = p -> next;
}
}
/* 判空 */
bool Empty(DLinkList L)
{
if(L->next == NULL)
{
return true;
}
else
return false;
}
/* 插入后继结点 */
bool InsertNextDNode(DNode *p, DNode *s)
{
if(p == NULL || s == NULL)
{
return false;
}
s -> next = p ->next;
if(p -> next != NULL)
{
p->next->prior = s;
}
s->prior = p;
p->next =s;
return true;
}
/* 删除p结点的后继结点*/
bool DeleteNextDNode(DNode *p)
{
if(p == NULL)
return false;
DNode *q = p -> next;
if(q == NULL)
return false;
p -> next = q -> next;
if(q -> next != NULL)
q->next->prior = p;
free(q);
return true;
}
/* 删除链表 */
void DestoryList(DLinkList &L)
{
while(L->next != NULL)
{
DeleteNextDNode(L);
}
free(L);
L = NULL;
}
int main()
{
DLinkList L; //双链表
InitDLinkList(L);
cout<<"请输入链表长度:";
int n=0; cin>>n;
CreateDLinkList(L,n);
TravelDLinkList(L);
return 0;
}
运行结果:
PS:目前遇到的双链表题不多,所以就没有多拓展,后面有待更新!
- 实现都只是个人的见解,欢迎大家批评指正!