您的位置:首页 > 理论基础 > 数据结构算法

双向链表的基本操作实现

2015-03-12 22:57 423 查看
#include<cstdio>
#include <cstdlib>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int ElemType;
typedef int Status;

typedef struct Node
{
ElemType date;
Node* prior;
Node * next;
} Node , *LinkList;

//初始化双向链表
Status InitList(LinkList &L)
{
int i,n;
Node* p=NULL;
Node* q=NULL;

L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
L->prior=NULL;

p=L;
printf("\n请输入要输入的数据个数:n \n");
scanf("%d",&n);

while(n<0)
{
printf("\n输入有误,请从新输入:\n");
scanf("%d",&n);
}

if(n==0)
{
return OK;
}

//尾插法初始化
for(i=1;i<=n;++i)
{
q=(Node*)malloc(sizeof(Node));
if(!p)
{
printf("\n内存分配失败!\n");
exit(OVERFLOW);
}
printf("\n请输入数据:\n");
scanf("%d",&q->date);
q->next=p->next;
p->next=q;
q->prior=L;
p=q;
}

//头插法初始化
/*for(i=1;i<=n;++i)
{
q=(Node*)malloc(sizeof(Node));
if(!p)
{
printf("\n内存分配失败!\n");
exit(OVERFLOW);
}
printf("\n请输入数据:\n");
scanf("%d",&q->date);
q->next=p->next;
q->prior=L;
L->next=q;
}*/

return OK;
}

//打印双向链表
Status PutOut(LinkList &L)
{
LinkList p=L;

if(!L->next)
{
printf("\n双向链表为空!\n");
return OK;
}
printf("\n双向链表表元数为:\n");
while(p->next)
{
printf(" %d",p->next->date);
p=p->next;
}
printf("\n\n");
return OK;
}

//双向链表长度
int ListLength(LinkList &L)
{
int i=0;
Node* p=NULL;
p=L->next;
while(p)
{
++i;
p=p->next;
}
return i;
}

//在双链表第 i位置插入元数
Status ListInsert(LinkList &L,int i,ElemType &e)
{
int j=1;
Node* p=L->next;
Node* q=NULL;

if(i<1||i>ListLength(L))
{
printf("\ni 值不合法请从新输入:1~%d\n",ListLength(L));
return ERROR;
}

while(p&&(j<i-1))
{
j++;
p=p->next;
}
q=(Node*)malloc(sizeof(Node));
q->date=e;

if(i==1)
{
q->next=L->next;
L->next=q;
q->prior=L;
}
else
{
q->next=p->next;
q->prior=p;
p->next->prior=q;
p->next=q;

}

return OK;
}

//删除双链表第 i个元素
Status ListDelete(LinkList &L,int i,ElemType &e)
{
int j=1;
Node* p=L->next;
Node* q=NULL;

if(i<1||i>ListLength(L))
{
printf("\ni 值不合法请从新输入:1~%d\n",ListLength(L));
return ERROR;
}

while(p&&(j<i-1))
{
j++;
p=p->next;
}

if(i==1)
{
p->next->prior=L;
L->next=p->next;
e=p->date;
free(p);
}
else
{
q=p->next;
q->next->prior=p;
p->next=q->next;
e=q->date;
free(q);
q=NULL;
}
return OK;
}

//销毁双链表
Status DestroyList(LinkList &L)
{
Node* p=NULL;
while(L->next)
{
p=L->next;
L->next=p->next;
free(p);
}
free(L);
L=NULL;
return OK;
}

//测试代码
int main()
{
int e2,e1=12;
LinkList L;

InitList(L);
//ListInsert(L,1,e1);
PutOut(L);
printf("\n链表长度为:%d\n",ListLength(L));

/*ListDelete(L,1,e2);
printf("%d\n",e2);
printf("\n链表长度为:%d\n",ListLength(L));
PutOut(L);
DestroyList(L);*/

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息