双向链表C/C++实现
结构体
typedef int ElemType;
typedef struct DNode
{
ElemType data;
struct DNode *prior,*next;
}DNode,*DLinkList;
初始化
// 初始化
bool InitDLinkList(DLinkList &L){
L = (DNode*)malloc(sizeof(DNode));
if(L==NULL) // 内存不足,分配失败
return false;
L->prior = NULL; // 头结点的prior永远指向NULL
L->next = NULL; // 头结点之后暂时还没有结点
return true;
}
尾插法创建表
//尾插法
//这个s->prior没问题
void List_TailInsert(DLinkList &L)
{
int x, n;
L = (DNode *)malloc(sizeof(DNode)); // 分配头结点
DNode *s,*r=L; // s用于存放数据,r表示尾部结点
printf("请输入你要创建单链表结点的个数\n");
scanf("%d", &n);
printf("请输入你要插入的数据\n");
for (int i = 0; i < n; i++)
{
scanf("%d", &x); // 输入节点的值
s = (DNode *)malloc(sizeof(DNode));
s->data = x;
s->prior = r;
r->next = s;
r = s;
}
r->next = NULL;
L->data = n; // 用头结点存放结点个数 不存放也可以,我选择存放
}
后插操作
注:后插操作是插入结点操作的子操作
// 后插操作
// 在p结点后插入结点s
bool InsertNextDNode(DNode *p,DNode *s){
if(p==NULL || s==NULL)
return false;
s->next = p->next;
s->prior = p;
//处理p是最后一个结点的情况
if(p->next!=NULL) //只有p不是最后一个结点的时候才把p下一个的结点的prior值赋成s
p->next->prior = s;
p->next = s;
}
前插操作
// 前插操作
// 在p结点前插入节点s
bool InsertPriorDNode(DNode *p,DNode *s){
if(p==NULL || s==NULL)
return false;
s->prior = p->prior;
s->next = p;
//处理p是头节点的情况
if(s->prior!=NULL) //只有p不是头节点的时候才把p的前一个结点的next赋成s
p->prior->next = s;
p->prior = s;
}
插入节点
// 插入结点
bool ListInsert(DLinkList &L,int i,ElemType e){
if(i<1)
return false;
int j = 0;
DNode *p = L;
while(p!=NULL&&j<i-1){ //找到j=i-1
p = p->next;
j++;
}
if(p==NULL)
return false;
DNode *s = (DNode*)malloc(sizeof(DNode));
s->data = e;
s->next = p->next;
s->prior = p;
if(p->next!=NULL)
p->next->prior = s;
p->next = s;
L->data += 1;
return true;
}
删除指定结点
注:删除指定结点是删除结点操作的子操作
// 删除p的后继节点并赋值给e
bool DeleteNextDNode(DNode *p,ElemType &e){
if(p==NULL)
return false;
DNode *q = p->next;
if(q==NULL)
return false;
e = q->data;
p->next = q->next;
if(q->next!=NULL)
q->next->prior = p;
free(q);
return true;
}
删除结点
//删除结点
bool ListDelete(DLinkList &L,int i,ElemType &e){
if(i<1)
return false;
int j = 0;
DNode *p = L,*q;
// 这里是且&& 要注意了!!!
while(p!=NULL&&j<i-1){
p = p->next;
j++;
}
if(p==NULL)
return false;
// q就是要删除的结点
q = p->next;
e = q->data;
p->next = q->next;
if(q->next!=NULL)
q->next->prior = p;
free(q);
L->data -= 1;
return true;
}