【数据结构笔记】线性表-双链表

#include 
#include 
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;
}

你可能感兴趣的:(数据结构,链表,c++)