双向链表的基本操作
链表节点结构图
插入节点结构图
插入节点结构图
DList.h
#ifnedf _DLIST_H
#define _DLIST_H
#include <stdlib.h>
#include <stdio.h>
#define DATATYPE int
typedef struct node{
int _iData;
struct node *pPerior;
struct node *pNext;
}DListNode;
DListNode *CreateDLinkListHead();
DListNode *CreateDListNode(DATATYPE _iData);
int IsEmptyDLinkList(DListNode *pHead);
void InsertDataListHead(DListNode *pHead, DATATYPE _iData);
void InsertDataListTail(DListNode *pHead, int _iData);
void PrintDLinkList(DListNode *pHead);
int DeleteData(DListNode *pHead, int _iData);
int InsertDataBehindNode(DListNode *pHead, int _iSpecilData, int _iInsertData);
void InsertDataFrontNode(DListNode *pHead, int _iSpecilData, int _iInsertData);
#endif
DLish.c
#include "DList.h"
DListNode *CreateDLinkListHead()
{
DListNode *pHead = (DListNode *)malloc(sizeof(DListNode));
if(NULL == pHead){
printf("malloc is failre %d\n",__LINE__);
return NULL;
}
pHead->_iData = -1;
pHead->pPerior = pHead;
pHead->pNext = pHead;
return pHead;
}
DListNode *CreateDListNode(DATATYPE _iData){
DListNode *pNode = (DListNode *)malloc(sizeof(DListNode));
if(NULL == pNode){
printf("malloc is failure %d\n",__LINE__);
return NULL;
}
pNode->_iData = _iData;
pNode->pPerior = NULL;
pNode->pNext = NULL;
return pNode;
}
int IsEmptyDLinkList(DListNode *pHead){
return (pHead->pPerior == pHead->pNext) ? 1 : 0;
}
void InsertDataListHead(DListNode *pHead, DATATYPE _iData){
DListNode *pnode = CreateDListNode(_iData);
if(NULL == pnode){
printf("Insert malloc is failure %d\n",__LINE__);
return;
}
pHead->pNext->pPerior = pnode;
pnode->pNext = pHead->pNext;
pnode->pPerior = pHead;
pHead->pNext = pnode;
g_INode++;
}
void InsertDataListTail(DListNode *pHead, int _iData){
if(NULL == pHead){
printf("param is null %d.\n",__LINE__);
return;
}
DListNode *pTemp = pHead;
while(pTemp->pNext != pHead){
pTemp = pTemp->pNext;
}
DListNode *pNode = CreateDListNode(_iData);
if(NULL == pNode){
printf("create node is failure %d.\n",__LINE__);
return ;
}
pTemp->pNext = pNode;
pNode->pPerior = pTemp;
pNode->pNext = pHead;
pHead->pPerior = pTemp;
g_INode++;
return;
}
void PrintDLinkList(DListNode *pHead){
if(NULL == pHead){
return;
}
int i = 0;
DListNode *pnode = pHead->pNext;
for(i = 0; i < g_INode; i++){
printf("%3d",pnode->_iData);
pnode = pnode->pNext;
}
putchar('\n');
return;
}
int DeleteData(DListNode *pHead, int _iData){
if(NULL == pHead){
return -1;
}
int iRet = -1;
int i = 0;
DListNode *pTemp = pHead->pNext;
DListNode *p = NULL;
while(pTemp != pHead){
if(pTemp->_iData == _iData)
{
iRet = 0;
p = pTemp->pPerior;
pTemp->pPerior->pNext = pTemp->pNext;
pTemp->pNext->pPerior = pTemp->pPerior;
free(pTemp);
g_INode--;
pTemp = p;
}
pTemp = pTemp->pNext;
}
return iRet;
}
int InsertDataBehindNode(DListNode *pHead, int _iSpecilData, int _iInsertData){
if(NULL == pHead){
printf("param is null %d ",__LINE__);
return -1;
}
DListNode *p = pHead->pNext;
DListNode *pInsetNode = CreateDListNode(_iInsertData);
while(p->pNext != pHead){
if(p->_iData == _iSpecilData){
pInsetNode->pPerior = p;
pInsetNode->pNext = p->pNext;
p->pNext->pPerior = pInsetNode;
p->pNext = pInsetNode;
g_INode++;
break;
}
p = p->pNext;
}
return 0;
}
void InsertDataFrontNode(DListNode *pHead, int _iSpecilData, int _iInsertData){
if(NULL == pHead){
printf("param is null %d ",__LINE__);
return ;
}
DListNode *p = pHead->pNext;
DListNode *pInsetNode = CreateDListNode(_iInsertData);
while(p->pNext != pHead){
if(p->_iData == _iSpecilData){
pInsetNode->pPerior = p->pPerior;
p->pPerior->pNext = pInsetNode;
pInsetNode->pNext = p;
p->pPerior = p;
g_INode++;
break;
}
p = p->pNext;
}
return;
}
Main.c
#include "DList.h"
int main(){
int i = 0;
int iData = 0;
int iData2 = 0;
int iRet = 0;
DListNode *pHead = CreateDLinkListHead();
if(NULL == pHead){
printf("Create Head Node is failure.\n");
return -1;
}
printf("头插法请插入5个数字到双向链表中 : ");
for(i = 0; i < 5; i++){
scanf("%d",&iData);
InsertDataListHead(pHead, iData);
}
printf("尾插法插入5个数字到双向链表中 :");
for(i = 0; i < 5; i++){
scanf("%d",&iData);
InsertDataListTail(pHead, iData);
}
PrintDLinkList(pHead);
printf("删除你想删除的元素:");
scanf("%d",&iData);
iRet = DeleteData(pHead, iData);
if(0 == iRet){
printf("您找到的 %d 元素存在 已删除!",iData);
}
printf("删除后的链表打印结果为:");
PrintDLinkList(pHead);
printf("请插入一个你想在 ");
scanf("%d",&iData);
printf("元素后面插入一个元素值为 ");
scanf("%d",&iData2);
InsertDataBehindNode(pHead, iData, iData2);
PrintDLinkList(pHead);
printf("请插入一个你想在 ");
scanf("%d",&iData);
printf("元素前面插入一个元素值为 ");
scanf("%d",&iData2);
InsertDataFrontNode(pHead, iData, iData2);
PrintDLinkList(pHead);
return 0;
}