一、定义双链表
代码实现:
#include<stdio.h>
typedef int ElemType;
typedef struct DNode { //定义双链表结点类型
ElemType data; //数据域
struct DNode* prior, * next; //前驱和后继指针
}DNode,*DLinkList;
二、双链表的初始化
二、双链表的插入
后插操作:
如果p是最后一个结点的话,因为p的下一个结点为空,所以会报错
处理严谨一些可以写成:
代码实现:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct DNode { //定义双链表结点类型
ElemType data; //数据域
struct DNode* prior, * next; //前驱和后继指针
}DNode,*DLinkList;
//创建一个双链表
DLinkList List_TailInsert(DLinkList& L) {
int x;
L = (DLinkList)malloc(sizeof(DNode));//创建头结点
DNode* s, * r = L;
scanf("%d", &x);
while (x!=9999)
{
s = (DLinkList)malloc(sizeof(DNode));
s->data = x;
r->next = s;
s->prior = r;
r = s;
scanf("%d", &x);
}
r->next = NULL;
return L;
}
//在p结点后插入s结点
bool InsertNextDNode(DNode* p, DNode* s) {
if (p==NULL||s==NULL)//非法参数
{
return false;
}
s->next = p->next;
if (p->next!=NULL)//如果p结点有后继结点
{
p->next->prior = s;
}
s->prior = p;
p->next = s;
return true;
}
//求链表的长度
int Length(DLinkList &L) {
int len = 0;
DNode* a = L;
while (a->next != NULL)
{
a = a->next;
len++;
}
return len;
}
void main() {
DLinkList L;
List_TailInsert(L);
printf("插入之前的双链表:\n");
DNode* a1 = L;
int length = Length(L);
for (int i = 0; i < length; i++)
{
a1 = a1->next;
printf("L[%d]=%d\n", i, a1->data);
}
//定义s结点
DNode* s = (DLinkList)malloc(sizeof(DNode));
s->data = 8;
InsertNextDNode(L->next,s);//在第1个结点后插入s
printf("插入之后的双链表:\n");
DNode* a = L;
int length1 = Length(L);
for (int i = 0; i < length1; i++)
{
a = a->next;
printf("L[%d]=%d\n", i, a->data);
}
}
运行结果:
前插操作:
前插操作只需要找到目标结点的前驱结点,然后用这个前驱结点进行后插操作即可
三、双链表的删除
代码实现:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct DNode { //定义双链表结点类型
ElemType data; //数据域
struct DNode* prior, * next; //前驱和后继指针
}DNode,*DLinkList;
//创建一个双链表
DLinkList List_TailInsert(DLinkList& L) {
int x;
L = (DLinkList)malloc(sizeof(DNode));//创建头结点
DNode* s, * r = L;
scanf("%d", &x);
while (x!=9999)
{
s = (DLinkList)malloc(sizeof(DNode));
s->data = x;
r->next = s;
s->prior = r;
r = s;
scanf("%d", &x);
}
r->next = NULL;
return L;
}
//删除p结点的后继结点
bool DeleteNextDNode(DNode* p) {
if (p==NULL)
{
return false;
}
DNode* q = p->next;//找到p的后继结点
if (q == NULL) {
return false; //p没有后继
}
p->next = q->next;
if (q->next!=NULL) { //q结点不是最后一个结点
q->next->prior = p;
}
free(q); //释放结点空间
return true;
}
//求链表的长度
int Length(DLinkList &L) {
int len = 0;
DNode* a = L;
while (a->next != NULL)
{
a = a->next;
len++;
}
return len;
}
void main() {
DLinkList L;
List_TailInsert(L);
printf("删除之前的双链表:\n");
DNode* a1 = L;
int length = Length(L);
for (int i = 0; i < length; i++)
{
a1 = a1->next;
printf("L[%d]=%d\n", i, a1->data);
}
DeleteNextDNode(L->next->next);//删除第二个的后继结点(这是一个带头结点)
printf("删除之后的双链表:\n");
DNode* a = L;
int length1 = Length(L);
for (int i = 0; i < length1; i++)
{
a = a->next;
printf("L[%d]=%d\n", i, a->data);
}
}
双链表的销毁: