数据结构之双链表
/*
*
*
*
*
*/
#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