完整的代码和测试结果在结尾!!
1、双链表的结构typedef struct DNode{ // 双链表的结构
int data;
struct DNode *prior,*next; // 前驱和后继指针
}DNode,*DLinkList;
2、双链表的初始化
// 初始化
bool InitDoubleLinkList(DLinkList &L){
L = (DNode *) malloc(sizeof(DNode)); // 开辟结点空间
L->prior = NULL;
L->next = NULL;
return true;
}
3、双链表的建立--尾插法
// 尾插法建立双向链表
DLinkList inserttail(DLinkList &L){
int x;
L = (DNode *) malloc(sizeof(DNode));
L->prior = NULL; // 初始化,头结点指向为空
L->next = NULL;
DNode *s,*r; // r 表示尾指针
r = L; // 刚开始尾指针就是头结点 !!!! 别忘记
scanf("%d",&x);
while(x != -1){ // x 输入 -1 时结束循环
s = (DNode *) malloc(sizeof(DNode)); // 开辟新结点,用于存放 x
s->data = x;
r->next = s;
s->prior = r;
r = s; // 新添加的结点变为新的尾结点
scanf("%d",&x);
}
r->next = NULL;
return L;
}
4、按位查找
// 按位查找
DNode *GetIndex(DLinkList L,int i){
if(i<0){
return NULL;
}
DNode *p ;
p = L;
int j = 0;
while(p!=NULL && jnext;
j++;
}
return p;
}
5、双链表中插入元素
// 双链表插入元素
bool insertE(DLinkList &L,int i,int e){
DNode *p;
DNode *s;
p = GetIndex(L,i-1);
s = (DNode *) malloc(sizeof(DNode)); // 开辟一个新的结点空间
s->data = e; // e 存放在s结点中
if(p->next != NULL){ // 如果 p 结点有后继结点
s->next = p->next; // 将p原来的下一个结点断开,由新结点 s指向p的下一个结点
p->next->prior = s;
}
p->next = s;
s->prior = p;
return true;
}
6、双链表中元素删除--并将删除元素返回
// 双链表删除元素 ,并返回删除的元素
bool deleteE(DLinkList &L,int i,int &e){
DNode *p;
DNode *q;
p = GetIndex(L,i-1);
q = (DNode *) malloc(sizeof(DNode));
q = p->next; // !!!老是忘记, 要删除的结点就是 p 的下一个结点
e = q->data;
if(q->next!=NULL){ // 删除的结点不是组后一个
p->next = q->next; // 连接好新的结点
q->next->prior = p;
}
free(q);
return true;
}
7、求表长
// 求双链表的表长
int Length(DLinkList L){
DNode *p;
p = L->next;
int j = 0;
while(p!=NULL){
p = p->next;
j++;
}
return j;
}
8、双链表的遍历
// 遍历输出
void toString(DLinkList L){
DLinkList p;
p = L->next;
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
}
完整代码及测试结果
#include#include // 要用 malloc 和 free 函数 要导入库文件 // 带头结点的双链表 typedef struct DNode{ // 双链表的结构 int data; struct DNode *prior,*next; }DNode,*DLinkList; // 初始化 bool InitDoubleLinkList(DLinkList &L){ L = (DNode *) malloc(sizeof(DNode)); // 开辟结点空间 L->prior = NULL; L->next = NULL; return true; } // 尾插法建立双向链表 DLinkList inserttail(DLinkList &L){ int x; L = (DNode *) malloc(sizeof(DNode)); L->prior = NULL; // 初始化,头结点指向为空 L->next = NULL; DNode *s,*r; // r 表示尾指针 r = L; // 刚开始尾指针就是头结点 !!!! 别忘记 scanf("%d",&x); while(x != -1){ // x 输入 -1 时结束循环 s = (DNode *) malloc(sizeof(DNode)); // 开辟新结点,用于存放 x s->data = x; r->next = s; s->prior = r; r = s; // 新添加的结点变为新的尾结点 scanf("%d",&x); } r->next = NULL; return L; } // 按位查找 DNode *GetIndex(DLinkList L,int i){ if(i<0){ return NULL; } DNode *p ; p = L; int j = 0; while(p!=NULL && jnext; j++; } return p; } // 双链表插入元素 bool insertE(DLinkList &L,int i,int e){ DNode *p; DNode *s; p = GetIndex(L,i-1); s = (DNode *) malloc(sizeof(DNode)); // 开辟一个新的结点空间 s->data = e; // e 存放在s结点中 if(p->next != NULL){ // 如果 p 结点有后继结点 s->next = p->next; // 将p原来的下一个结点断开,由新结点 s指向p的下一个结点 p->next->prior = s; } p->next = s; s->prior = p; return true; } // 双链表删除元素 ,并返回删除的元素 bool deleteE(DLinkList &L,int i,int &e){ DNode *p; DNode *q; p = GetIndex(L,i-1); q = (DNode *) malloc(sizeof(DNode)); q = p->next; // !!!老是忘记, 要删除的结点就是 p 的下一个结点 e = q->data; if(q->next!=NULL){ // 删除的结点不是组后一个 p->next = q->next; // 连接好新的结点 q->next->prior = p; } free(q); return true; } // 求双链表的表长 int Length(DLinkList L){ DNode *p; p = L->next; int j = 0; while(p!=NULL){ p = p->next; j++; } return j; } // 遍历输出 void toString(DLinkList L){ DLinkList p; p = L->next; while(p!=NULL){ printf("%d ",p->data); p = p->next; } } int main() { DLinkList L; InitDoubleLinkList(L); // 尾插法 inserttail(L); toString(L); printf("链表的长度:%dn",Length(L)); // 删除操作 int e = -1; deleteE(L,2,e); printf("删除的元素是:%dn",e); toString(L); printf("链表的长度:%dn",Length(L)); // 插入元素 insertE(L,3,1000); toString(L); printf("链表的长度:%dn",Length(L)); return 0; }



