数据结构之双链表

数据结构之双链表

/*
 *
 *
 *
 *
 */

#ifndef	DOUBLELIST_H
#define	DOUBLELIST_H

#define TEST 1

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

typedef int DATATYPE;

typedef struct dList
{
	DATATYPE ldata;
	struct dList *pFront;
	struct dList *pRear;
}stDListNode;

//创建双链表
stDListNode* CreateList(void);

//删除链表
void DelList(stDListNode* pDList);

//插入一个节点
int InsertNode(stDListNode* pDList, DATATYPE data);

//获取一个节点,返回这个节点的指针
stDListNode* GetNode(stDListNode* pDList, DATATYPE data);

//删除一个节点
void DelDNode(stDListNode* pDList, int nodeId);

//删除相同的所有节点
void DelAllNode(stDListNode* pDList, DATATYPE data);

//更新节点数据
int UpdateDataForNode(stDListNode* pDList, int nodeId, DATATYPE data);

//获取链表长度
int GetLength(stDListNode* pDList);

//显示所有数据
void Display(stDListNode* pDList);

#endif

/*
 *
 *
 *
 *
 */
 
#include "doubleList.h"
 
//创建双链表
stDListNode* CreateList(void)
{
	stDListNode* pHead = NULL;
	
	pHead = (stDListNode*)malloc(sizeof(stDListNode));
	
	if(NULL == pHead)
	{
		return NULL;
	}
	
	pHead->ldata = 0;
	pHead->pFront = NULL;
	pHead->pRear = NULL;
	
	return pHead;
}

//删除链表
void DelDList(stDListNode* pDList)
{
	stDListNode* pTemp = NULL;
	
	if(NULL != pDList)
	{
		if(NULL == pDList->pRear)
		{
			free(pDList);
			return;
		}
	
		while(NULL != pDList->pRear)
		{
			pDList = pDList->pRear;
		}
		
		while(NULL != pDList->pFront)
		{
			pTemp = pDList;
			pDList = pDList->pFront;
			free(pTemp);
		}
		
		free(pDList);
		
		return;
	}
}

//在链表尾部添加一个节点
int InsertNode(stDListNode* pDList, DATATYPE data)
{
	stDListNode* pNode = NULL;
	
	if(NULL == pDList)
	{
		return 0;
	}
	
	pNode = (stDListNode*)malloc(sizeof(stDListNode));
	if(NULL == pNode)
	{
		return 0;
	}
	pNode->ldata = data;
	
	while(NULL != pDList->pRear)
	{
		pDList = pDList->pRear;
	}
	
	pDList->pRear = pNode;
	pNode->pFront = pDList;
	
	pNode->pRear = 	NULL;
	
	return 1;//节点添加成功
}

//获取一个节点,返回这个节点的指针
stDListNode* GetNode(stDListNode* pDList, DATATYPE data)
{
	if(NULL == pDList)
	{
		return NULL;
	}
	
	while(NULL != pDList->pRear)
	{
		if(data == pDList->ldata)
		{
			return pDList;
		}
		
		pDList = pDList->pRear;
	}
	
	return NULL;
}

//删除一个指定位置的节点
void DelNode(stDListNode* pDList, int nodeId)
{
	stDListNode* pTemp;
	
	if(NULL == pDList || nodeId < 0)
	{
		return;
	}
	
	//找到要删除节点的指针
	while(nodeId--)
	{
		pDList = pDList->pRear;
	}
	
	//指向要删除节点的前驱节点
	pTemp = pDList->pFront;
	
	pTemp->pRear = pDList->pRear;
	(pDList->pRear)->pFront = pTemp;
	
	free(pDList);
}

//删除相同的所有节点
void DelAllNode(stDListNode* pDList, DATATYPE data);

//更新节点数据
int UpdateDataForNode(stDListNode* pDList, int nodeId, DATATYPE data)
{
	if(NULL == pDList || nodeId <= 0)
	{
		return 0;
	}
	
	//找到要修改节点的指针
	while(nodeId--)
	{
		pDList = pDList->pRear;
	}
	
	pDList->ldata = data;
	
	return 1;	
}

//获取链表长度
int GetLength(stDListNode* pDList)
{
	int length = 0;
	
	if(NULL == pDList)
	{
		return 0;
	}
	
	pDList = pDList->pRear;
	
	while(NULL != pDList->pRear)
	{
		pDList = pDList->pRear;
		length++;
	}
	
	return length;
}

//显示所有数据
void Display(stDListNode* pDList)
{
	if(NULL == pDList)
	{
		return;
	}
	
	pDList = pDList->pRear;
	
	while(NULL != pDList->pRear)
	{
		printf(" %d ", pDList->ldata);
		pDList = pDList->pRear;
	}
}

#if TEST > 0

int main(void)
{
	stDListNode* dList = CreateList();
	
	if(NULL == dList)
	{
		return 0;
	}
	
	int i;
	
	for (i = 10; i >= 0; i--)
	{
		if(InsertNode(dList, i))
		{
		printf("Insert data OK\n");
		}
	}
	
	Display(dList);
	
	printf("\ndList length : %d", GetLength(dList));
	
	DelDList(dList);
	
	return 1;
}

#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值