完整的代码和测试结果在结尾!!
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;
}
}
#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("链表的长度:%d\n",Length(L));
// 删除操作
int e = -1;
deleteE(L,2,e);
printf("删除的元素是:%d\n",e);
toString(L);
printf("链表的长度:%d\n",Length(L));
// 插入元素
insertE(L,3,1000);
toString(L);
printf("链表的长度:%d\n",Length(L));
return 0;
}