数据结构之双向链表实现
代码及思想
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef int ElemType;
#define OK 1
#define ERROR 0
#define Status int
typedef struct DLNode
{
ElemType data;
struct DLNode *prior,*next;
}DLNode,*DLinkList;
void DLinkListInit(DLinkList L);
DLNode *CreateNode(ElemType x);
Status DLinkListCreateH(DLinkList L,ElemType x);
Status DLinkListCreateT(DLinkList L,ElemType x);
int DLinkListLength(DLinkList L);
Status DLinkListInsert(DLinkList L,int i,ElemType x);
Status DLinkListDelete(DLinkList L,ElemType x);
void DLinkListTraverse(DLinkList L);
Status DLinkListFind(DLinkList L,ElemType x);
void DLinkListDestroy(DLinkList L);
void DLinkListInit(DLinkList L)
{
if(L == NULL)
return;
L->prior = NULL;
L->next = NULL;
}
DLNode *CreateNode(ElemType x)
{
DLNode *node = (DLNode*)malloc(sizeof(DLNode));
node->data = x;
node->next = NULL;
node->prior = NULL;
return node;
}
Status DLinkListCreateH(DLinkList L,ElemType x)
{
DLNode *node = CreateNode(x);
node->next = L->next;
node->prior = L;
if(node->next != NULL)
{
node->next->prior = node;
}
L->next = node;
return OK;
}
Status DLinkListCreateT(DLinkList L,ElemType x)
{
DLNode *node = CreateNode(x);
DLNode *temp = L;
while(temp->next != NULL)
{
temp = temp->next;
}
node->prior = temp;
temp->next = node;
return OK;
}
int DLinkListLength(DLinkList L)
{
DLNode *node = L;
int length=0;
while(node->next != NULL)
{
length++;
node = node->next;
}
return length;
}
Status DLinkListInsert(DLinkList L,int i,ElemType x)
{
DLNode *node = (DLNode *)malloc(sizeof(DLNode));
DLNode *temp = L;
node->data = x;
for(int j=i;j>1;j--)
{
temp = temp->next;
}
if(i<=0)
{
cout<<"请检查插入位置!!"<<endl;
return ERROR;
}
node->next = temp->next;
node->next->prior = temp;
temp->next = node;
node->prior = temp;
return OK;
}
Status DLinkListDelete(DLinkList L,ElemType x)
{
DLNode *temp;
DLNode *p = L->next;
DLNode *pre = L;
while(p != NULL)
{
if(p->data == x)
{
pre->next = p->next;
p->next->prior = pre;
temp = p;
free(p);
}
p = p->next;
pre = pre->next;
}
return OK;
}
void DLinkListTraverse(DLinkList L)
{
DLNode *node = L;
for(node = L;node->next!=NULL;node=node->next)
{
cout<<""<<node->next->data<<" ";
}
cout<<endl;
}
Status DLinkListFind(DLinkList L,ElemType x)
{
DLNode *node = CreateNode(x);
node = L->next;
int cnt = 0;
while(node!=L)
{
if(node->data == x)
{
return cnt;
return OK;
}
cnt++;
}
return ERROR;
}
void DLinkListDestroy(DLinkList L)
{
if(L->next == NULL)
return;
DLNode *temp,*ex;
while(L != NULL)
{
for(temp = L->next;temp->next != NULL;)
{
ex = temp;
temp=temp->next;
free(ex);
}
}
}
int main()
{
DLinkList L = (DLinkList )malloc(sizeof(DLNode));
DLinkListInit(L);
for(int i=1;i<11;i++)
{
DLinkListCreateT(L,i);
}
cout<<"1、初始化链表为1-10,此时链表中元素有:"<<endl;
DLinkListTraverse(L);
cout<<"*此时链表长度为:"<<DLinkListLength(L)<<endl;
DLinkListDelete(L,1);
cout<<"2、删除元素1后链表中元素有:"<<endl;
DLinkListTraverse(L);
cout<<"**此时链表长度为:"<<DLinkListLength(L)<<endl;
DLinkListInsert(L,3,11);
cout<<"3、将11插入第3个位置后链表中元素有:"<<endl;
DLinkListTraverse(L);
cout<<"***此时链表长度为:"<<DLinkListLength(L)<<endl;
cout<<"3、第3个结点(L->next->next->next11)前(node->prior)后(node->next)位置的元素为:"<<endl;
DLNode *node = L->next->next->next;
cout<<node->prior->data<<" "<<node->next->data<<endl;
return 0;
}
测试截图
![双向链表](https://i-blog.csdnimg.cn/blog_migrate/b64255e9ec0d52acedf7f4e2c1d997f7.png)