双链表插入步骤 先1再2后34 3和4的顺序可以颠倒
双链表删除结点
双链表的基本操作代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct DNode{
int data;
struct DNode *prior,*next;
}DNode,*DLinkList;
//创建双链表
DLinkList CreateDLinkList(DLinkList L,int *a,int len)
{
DNode *s,*q;
L=(DLinkList)malloc(sizeof(DNode));
L->next=NULL;
L->prior=NULL;
q=L;
int i=0;
while(len>=1)
{
s=(DNode*)malloc(sizeof(DNode));
s->data=a[i];
s->next=q->next;
s->prior=q;
q->next=s;
q=s;
len--;
i++;
}
return L;
}
//在p节点后插入s节点
void InsertNextDNode(DNode *p,DNode *s)
{
if(p==NULL && s==NULL)
{
printf("节点出错\n");
}
s->next=p->next;
if(p->next!=NULL)
{
p->next->prior=s;
}
p->next=s;
s->prior=p;
}
//删除p节点的后继节点
void DeleteNextDNode(DNode *p)
{
if(p==NULL)
printf("删除节点出错\n");
DNode *q=p->next;
if(q==NULL)
printf("删除节点出错\n");
p->next=q->next;
if(q->next!=NULL)
{
q->next->prior=p;
}
free(q);
}
//双链表的遍历
void DListDisplay(DLinkList L)
{
DLinkList q=L->next;
while(q!=NULL)
{
printf("-------->%d\n",q->data);
q=q->next;
}
}
//在双链表的i位置前插入元素e
void DListInsertPrior(DLinkList L,int i,int e)
{
int j=0;
if(i<1)
printf("插入出错\n");
DNode *q=L,*s;
while(q!=NULL && j<i-1)
{
q=q->next;
j++;
}
if(q==NULL)
printf("插入出错\n");
s=(DNode*)malloc(sizeof(DNode));
s->data=e;
s->next=NULL;
s->prior=NULL;
InsertNextDNode(q,s);
}
//删除指定位序i的节点
void DeleteDList(DLinkList L,int i)
{
DNode *q=L;
int j=0;
while(q!=NULL && j<i-1)
{
q=q->next;
j++;
}
if(q==NULL)
printf("删除出错\n");
DeleteNextDNode(q);
}
int main()
{
DLinkList L;
int a[5]={1,2,3,4,5};
L=CreateDLinkList(L,a,5);
DListDisplay(L);
DListInsertPrior(L,2,7);
DListDisplay(L);
DeleteDList(L,6);
DListDisplay(L);
}
运行结果: