线性表之双向链表

//*******************************双向链表************************

#include <stdio.h>
#include <stdlib.h>


//============状态量======== 
#define OK 1
#define ERROR 0
//==================ADT 双链表结构说明===================
typedef int ElemType;
typedef struct DNode{
	ElemType data;
	struct DNode *prior;
	struct DNode *next; 
}DListNode;
typedef DListNode *DLinkList;                 //节点


//=========================模块定义============= 


/* 内置函数 定义 */
static DLinkList newNode(){
	DLinkList pNew = (DLinkList)malloc(sizeof(DListNode));
	if(pNew != NULL){
		pNew->next = pNew->prior = NULL;
	}
	return pNew;
} 




/* 初始化 */ 
void InitList(DLinkList *L){
	(*L) = newNode();
	if(*L == NULL){
		printf("初始化失败!\n");
		exit(EXIT_FAILURE);
	}
}


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


/* 判断表空 */
int ListEmpty(DLinkList L){
	return (L->next == NULL);
} 


/* 求表长 */
int ListLength(DLinkList L){
	DLinkList p = L;
	int i = 0;
	
	for(;p->next != NULL;p = p->next)
		i++;	
	return i;	
} 
/* 输出表 */
void DispList(DLinkList L){
	DLinkList p = L->next;
	while(p != NULL){
		printf("%d ", p->data);	
		p = p->next;
	} 
	printf("\n");
} 
/* 获取元素 */
int GetElem(DLinkList L, int i, ElemType *e){
	int j = 0;
	DLinkList p = L;
	while(j < i && p != NULL){
		j++;
		p = p->next;
	}
	if(p == NULL)
		return ERROR;
	else{
		*e = p->data;
		return OK;
	}
} 
/* 求元素位置 */
int LocateElem(DLinkList L, ElemType e){
	int i = 1;
	DLinkList p = L->next;
	while(p != NULL && p->data != e){
		i++;
		p = p->next;
	}
	if(p == NULL)
		return ERROR;
	else
		return i;
} 
/* 插入元素 */
int InsertList(DLinkList L, int i, ElemType e){
	int j = 0;
	DLinkList p = L;
	DLinkList pNew = NULL;
	
	while(j < i - 1 && p != NULL){
		j++;
		p = p->next;
	}
	if(p == NULL)
		return ERROR;
	else{
		pNew = newNode();
		pNew->data = e;
		pNew->next = p->next;                //先连后面 
		if(p->next != NULL)                  //p如果是尾节点 
			p->next->prior = pNew;
		p->next = pNew;
		pNew->prior = p; 
		return OK;
	}
}
/* 删除指定位置元素,并返回其值 */
int DeleteList(DLinkList L, int i, ElemType *e){
	int j = 0;
	DLinkList p = L;
	DLinkList q = NULL;
	
	while(j < i - 1 && p != NULL){                 //查找前驱节点 
		j++;
		p = p->next;
	}
	if(p == NULL)
		return ERROR;
	else{
		q = p->next;                             //被删除节点 
		if(q == NULL)                            //如果不存在 
			return ERROR;
		*e = q->data;
		p->next = q->next;
		if(q->next != NULL)                     //如果不是删除最后一个节点 
			q->next->prior = p;
		free(q);
		return OK;
	}
} 

欢迎参考,
阅读更多
文章标签: 线性表 双向链表
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭