#include<stdio.h>
#include<stdlib.h>
typedef struct DNode
{
int data;
struct DNode *prior ,*next;
}DNode,*DLinkList;
int ListLength(DLinkList L);
DLinkList GetElem(DLinkList L,int i);
DLinkList DList_TailInsert(DLinkList &L,int a[],int n)
{
DNode *s,*r;
int i;
L=(DNode*)malloc(sizeof(DNode));
L->next=NULL;
L->prior=NULL;
r=L;//r总是指向终端结点
for(i=0;i<n;++i)
{
s=(DNode*)malloc(sizeof(DNode));
s->data=a[i];
r->next=s;
s->prior=r;
r=s;
}
r->next=NULL;
return L;
}
void ListTraverse(DLinkList L)
{
DNode*p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int ListLength(DLinkList L)
{
int i=0;
DNode *p=L->next;
while(p!=NULL)
{
++i;
p=p->next;
}
return i;
//printf("链表的长度为%d\n",i);
}
bool InsertNextDNode(DNode *p,DNode *s)
{
if(p==NULL||s==NULL)
return false;
s->next=p->next;
if(p->next!=NULL)
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
DLinkList GetElem(DLinkList L,int i)
{
int j;
DLinkList p=L;
if(i<0||i>ListLength(L)+1)
return NULL;
for(j=1;j<=i;j++)
{
p=p->next;
}
return p;
}
bool ListInsert(DLinkList L,int i,int e)//在第i个位置之前插入元素e
{
DNode *p,*s;
if(i<1||i>ListLength(L)+1)
return false;
p=GetElem(L,i-1);
s=(DNode*)malloc(sizeof(DNode));
if(s==NULL)
return false;
s->data=e;
/*s->next=p->next;
s->prior=p;
p->next->prior=s;
p->next=s;
return true;*/
return InsertNextDNode(p,s);//封装后的结果,上面注释的写法也可以
}
bool ListDelete(DLinkList L,int i,int &e)//删除第i个元素
{
DNode* p;
if(i<1)
return false;
p=GetElem(L,i);
if(p==NULL)//第i个元素不存在
return false;
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return true;
}
int main()
{
int e;
int n;
printf("请输入想要生成链表个数",n);
scanf("%d",&n);
int a[n];
for(int i=0;i<n;++i)
{
printf("请输入第%d个元素的值",i+1);
scanf("%d",&a[i]);
}
DLinkList L=NULL;
DList_TailInsert(L,a,n);
if(ListInsert(L,4,3))
printf("插入成功");
else
printf("插入失败");
//LengthList(L);
ListTraverse(L);
if(ListDelete(L,1,e))
{
printf("删除成功");
}
else
{
printf("删除失败");
}
ListTraverse(L);
}
双链表的插入与删除(可运行)
最新推荐文章于 2024-01-21 17:59:49 发布