#include <iostream>
#include <stdlib.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef struct DNode{
int data;
struct DNode *prior,*next; //定义前驱和后继指针
}DNode,*DLinkList; //DNode *与DLinkList作用一样,前者强调结点,后者强调双链表
//初始化双链表
bool InitDLinkList(DLinkList &L){
L=(DNode *)malloc(sizeof(DNode)); //头结点
if(L==NULL) //内存不足导致分配失败
return false;
L->prior=NULL; //头结点的prior永远指着null
L->next=NULL;
return true;
}
//判断双链表是否为空(带头结点)
bool Empty(DLinkList L){
if(L->next==NULL)
return true;
else
return false;
}
//在p结点之后插入s结点
bool InsertNextNode(DNode *p,DNode *s){
s->next=p->next;
p->next->prior=s;
p->next=s; //s->prior=p;(顺序交换)
s->prior=p; //p->next=s;
}
//在p结点之前插入s结点
bool InsertBefore(DNode *p,DNode *s){
s->next=p;
p->prior->next=s;
s->prior=p->prior;
p->prior=s;
}
//删除p结点的后继结点
bool DeleteNextNode(DNode *p){
if(p==NULL) //p是NULL
return false;
DNode *q=p->next; //找到p的后继节点
if(q==NULL)
return false; //p没有后继结点
p->next=q->next;
if(q->next!=NULL) //q不是最后一个结点
q->next->prior=p;
free(q);
return true;
}
//删除整个链表
bool DestroyLlist(DLinkList &L){
while(L->next!=NULL)
DeleteNextNode(L); //删除头结点后的每一个结点
free(L); //释放头结点
L=NULL; //使头指针指向NULL
}
//双链表遍历
while(p!=NULL){
//处理p结点..等
p=p->next; //此为后项遍历,前向遍历,将此句改成 p=p->prior;
}
void testDLinkList(){
DLinkList L;
InitDLinkList(L);
Empty(L);
}
int main(int argc, char** argv) {
cout << "hello";
return 0;
}
【数据结构笔记】线性表-双链表
最新推荐文章于 2024-09-25 09:12:27 发布