#include <iostream>
#include <cstdio>
#include <malloc.h>
typedef int ElemType;
using namespace std;
typedef struct DuLNode
{
ElemType data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;
///创建带有头结点的双链表,顺序输入
void createDuList_DL(DuLinkList &DL,int n)
{
DL=(DuLinkList)malloc(sizeof(DuLNode));
DL->data=0;
DL->prior=NULL;
DL->next=NULL;
DuLNode *r=DL; //last node
for(int i=1;i<=n;i++)
{
DuLNode *p=(DuLinkList)malloc(sizeof(DuLNode));
p->data=i;
p->next=r->next;
p->prior=r;
r->next=p;
r=p;
}
}
///查找双链表中第i个位置的元素
bool GetElem_DL(DuLinkList DL,int i,ElemType &e)
{
DuLNode *p=DL->next;
int j=1;
for(;p&&j<i;j++)
{
p=p->next;
}
if(!p||j>i)
return false;
e=p->data;
return true;
}
///在第i个位置前面插入一个元素
bool InsertDuList_DL(DuLinkList &DL,int i,ElemType e)
{
DuLNode *p=DL->next;
int j=1;
for(;p&&j<i-1;j++)
p=p->next;
if(!p||j>i-1)
return false;
DuLNode *s=(DuLinkList)malloc(sizeof(DuLNode));
s->data=e;
s->next=p->next;
s->prior=p;
if(p->next!=NULL)
p->next->prior=s;
p->next=s;
return true;
}
///删除链表中第i个位置的元素,并用e返回
bool DeleteDulist_DL(DuLinkList &DL,int i,ElemType &e)
{
DuLNode *p=DL->next;
int j=1;
for(;p&&j<i;j++)
p=p->next;
if(!p||j>i)
return false;
p->prior->next=p->next;
if(p->next!=NULL)
p->next->prior=p->prior;
e=p->data;
free(p);
return true;
}
///销毁整个双链表
void FreeDuList_DL(DuLinkList &DL)
{
if(DL)
{
DuLNode *p=DL;
while(p)
{
DL=DL->next;
if(DL!=NULL)
DL->prior=NULL;
free(p);
p=NULL;
p=DL;
}
}
}
///双链表逆序
bool ReverseDuList_DL(DuLinkList &DL)
{
if(DL==NULL||DL->next==NULL)
return false;
else
{
DuLNode *p=DL->next;
DuLNode *q=p->next;
while(q)
{
p->next=q->next;
if(q->next!=NULL)
q->next->prior=p;
q->next=DL->next;
DL->next->prior=q;
DL->next=q;
q->prior=DL;
q=p->next;
}
return true;
}
}
///打印双链表中的元素
void printDuList_DL(DuLinkList DL)
{
if(DL==NULL)
printf("The list is invalid!\n");
else if(DL->next==NULL)
printf("The list is null!\n");
else
{
DuLNode *p=DL->next;
printf("The elements of list:\n");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
}
int main()
{
DuLinkList DLa;
createDuList_DL(DLa,5);
printDuList_DL(DLa);
ElemType e=6;
//GetElem_DL(DLa,3,e);
//InsertDuList_DL(DLa,6,e);
//DeleteDulist_DL(DLa,1,e);
//ReverseDuList_DL(DLa);
FreeDuList_DL(DLa);
printDuList_DL(DLa);
//printf("e=%d\n",e);
return 0;
}
双链表的简单实现
最新推荐文章于 2021-02-28 10:10:31 发布