双向链表的建立,查找,插入(前插和后插),删除操作
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//获取某个位置的结点算法其实和单链表的一样,并且双链表的提出就是为了解决单链表无法找到前驱元素的问题,所以找到某个位置的结点算法不再赘述
typedef int ElemType;
typedef struct DNode
{
ElemType data;
struct DNode *prior, *next;
} DNode, *DLinkList;
//头插法建立双链表
DLinkList DList_TailInsert(DLinkList &L, int n)
{
srand(time(0));
L = (DLinkList)malloc(sizeof(DLinkList));
L->prior = NULL; //头结点的前驱结点恒为空指针
DNode *r = L;
for (int i = 0; i < n; i++)
{
DNode *s;
s = (DNode *)malloc(sizeof(DNode));
s->data = rand() % 100 + 1;
r->next = s;
s->prior = r;
r = s;
}
r->next = NULL;
return L;
}
//找到某个位置处的结点
DNode *GetNode(DLinkList &L, int i)
{
int j = 1;
DNode *p = L->next;
if (i == 0)
{
return L;
}
while (p != NULL && j < i)
{
p = p->next;
j++;
}
return p;
}
//在p结点前插入一个新的元素
DLinkList Head_InsertElem(DLinkList &L, DNode *p, ElemType e)
{
DNode *s;
s = (DNode *)malloc(sizeof(DNode));
s->data = e;
p->prior->next = s;
s->prior = p->prior;
s->next = p;
p->prior = s;
}
//在p结点后插入一个新的元素
DLinkList Tail_InsertElem(DLinkList &L, DNode *p, ElemType e)
{
DNode *s;
s = (DNode *)malloc(sizeof(DNode));
s->data = e;
p->next->prior = s;
s->next = p->next;
s->prior = p;
p->next = s;
}
//删除一个p的后继结点
DLinkList DeleteNode(DLinkList &L, DNode *p)
{
DNode *q = p->next;
p->next = q->next;
q->next->prior = p;
}
//输出链表所有数据
void PutAllElem(DLinkList &L)
{
DNode *p = L->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
}
//调试部分
int main()
{
DLinkList L;
DList_TailInsert(L, 5);
PutAllElem(L);
printf("\n");
DNode *p = GetNode(L, 1);
Head_InsertElem(L, p, 985);
PutAllElem(L);
printf("\n");
Tail_InsertElem(L, p, 211);
PutAllElem(L);
printf("\n");
DeleteNode(L, p);
PutAllElem(L);
printf("\n");
system("pause");
return 0;
}