第二章--线性表----双链表

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







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值