双链表的实现

跟单链表有点像,主要区别就在建表,插入元素,删除元素这里。

双链表数据结构为:

typedef struct  DNode{
	ElemType data;        //节点数据 
	struct DNode* prior;   //指向前一节点指针 
	struct DNode* next;    //指向后一节点指针 
}DLinkList;
实现下列函数:

void CreateListF(DLinkList *&L,ElemType a[],int n);  //头插法建表
void CreateListR(DLinkList *&L,ElemType a[],int n); //尾插法建表
void InitList(DLinkList *&L);  //初始化链表
void DestroyList(DLinkList *&L);  //销毁链表
int ListEmpty(DLinkList *L);  //判断链表是否为空
int ListLength(DLinkList *L);  //求链表长度
void DispList(DLinkList *L);  //输出链表
int GetElem(DLinkList *L,int i,ElemType &e);  //求链表里第i个节点的值,并赋值给e 
int LocateElem(DLinkList *L,ElemType e); //求与e值相等的第一个元素的序号 
int InsertElem(DLinkList *&L,int i,ElemType e); //插入元素
int DeleteElem(DLinkList *&L,int i,ElemType &e); //删除元素 
具体实现代码:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define ElemType float
#define GET_ARRAY_LEN(array)   (sizeof(array)/sizeof(array[0]))

using namespace std; 

typedef struct  DNode{
	ElemType data;        //节点数据 
	struct DNode* prior;   //指向前一节点指针 
	struct DNode* next;    //指向后一节点指针 
}DLinkList;

void CreateListF(DLinkList *&L,ElemType a[],int n);  //头插法建表
void CreateListR(DLinkList *&L,ElemType a[],int n); //尾插法建表
void InitList(DLinkList *&L);  //初始化链表
void DestroyList(DLinkList *&L);  //销毁链表
int ListEmpty(DLinkList *L);  //判断链表是否为空
int ListLength(DLinkList *L);  //求链表长度
void DispList(DLinkList *L);  //输出链表
int GetElem(DLinkList *L,int i,ElemType &e);  //求链表里第i个节点的值,并赋值给e 
int LocateElem(DLinkList *L,ElemType e); //求与e值相等的第一个元素的序号 
int InsertElem(DLinkList *&L,int i,ElemType e); //插入元素
int DeleteElem(DLinkList *&L,int i,ElemType &e); //删除元素 


void CreateListF(DLinkList* &L,ElemType a[],int n){
	L=(DLinkList *)malloc(sizeof(DLinkList));
	L->prior=L->next=NULL;
	DLinkList *p=L;
	for(int i=0;i<n;i++){
		DLinkList* addNumber=(DLinkList* )malloc(sizeof(DLinkList));
		addNumber->data=a[i];
		if(p->next!=NULL){
			addNumber->prior=p->next->prior;
			addNumber->next=p->next;
			p->next->prior=addNumber;
			p->next=addNumber;
 		} 
		else {
			addNumber->prior=p;
			addNumber->next=NULL;
			p->next=addNumber;
		}
	} 
}

void CreateListR(DLinkList* &L,ElemType a[],int n){
	L=(DLinkList *)malloc(sizeof(DLinkList));
	L->prior=L->next=NULL;
	DLinkList *p=L;
	for(int i=0;i<n;i++){
		DLinkList* addNumber=(DLinkList *)malloc(sizeof(DLinkList));
		addNumber->data=a[i];
		addNumber->prior=p;
		addNumber->next=NULL;
		p->next=addNumber;
		p=p->next; 
	} 
}


void InitList(DLinkList* &L){
	L=(DLinkList *)malloc(sizeof(DLinkList));
	L->prior=L->next=NULL;
} 

void DestroyList(DLinkList* &L){
	DLinkList* p=L;
	DLinkList* q=L->next;
	while(q!=NULL){
		free(p);
		p=q;
		q=q->next;
	}
	free(p);
}

int  ListEmpty(DLinkList* L){
	return(L->next==NULL);
}

int ListLength(DLinkList* L){
	int count=0;
	DLinkList* p=L->next;
	while(p!=NULL){
		count++;
		p=p->next;
	}
	return count;
}

void DispList(DLinkList* L){
	DLinkList* p=L->next;
	while(p!=NULL){
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}

int GetElem(DLinkList* L,int i,ElemType &e){
	DLinkList* p=L;
	int j=0;
	while(j<i&&p!=NULL){
		p=p->next;
		j++;
	}
	if(i<1||p==NULL)return -1;
	else{
		e=p->data;
		return 1;
	}	
}

int LocateElem(DLinkList* L,ElemType e){
	DLinkList* p=L->next;
	int i=1;
	while((!(-1e-9<p->data-e&&p->data-e<1e-9))&&p!=NULL){
		p=p->next;
		i++;
	}
	if(p==NULL)return -1;
	else return i;
}

int InsertElem(DLinkList* &L,int i,ElemType e){
	DLinkList* p=L->next;
	int j=1;
	while(j<i&&p!=NULL){
		j++;
		p=p->next;
	}
	if((p==NULL&&i>j+1)||i<1)return -1;
	else{
		DLinkList* addNumber=(DLinkList *)malloc(sizeof(DLinkList));
		addNumber->data=e;
		addNumber->prior=p->prior;
		addNumber->next=p;
		p->prior->next=addNumber;
		p->prior=addNumber;
		return 1;
	} 	 
}


int DeleteElem(DLinkList* &L,int i,ElemType &e){
	DLinkList* p=L->next;
	int j=1;
	while(j<i&&p!=NULL){
		j++;
		p=p->next; 
	}
	if(i<1||p==NULL)return -1;
	else{
		e=p->data;
		if(p->next!=NULL){
		p->next->prior=p->prior;
		p->prior->next=p->next;
		free(p);
		}
		else{
		p->prior->next=NULL;
		free(p);
		}
		return 1;
	}	 
}


int main(){
	DLinkList *L=NULL;
	float a[]={3.4,8.7,1,3,9.7,4,5.6,3};
	ElemType e;	
	CreateListF(L,a,GET_ARRAY_LEN(a));
	DispList(L);
	DestroyList(L);
	CreateListR(L,a,GET_ARRAY_LEN(a));
    DispList(L);
    GetElem(L,4,e);
    cout<<e<<endl;
    cout<<LocateElem(L,e)<<endl;
    DeleteElem(L,3,e);
    DispList(L);
    InsertElem(L,1,78.4);
    DispList(L);
    cout<<ListLength(L);
	return 0;
}

运行结果如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值