解题思路:
双链表插入过程
以下介绍的是头插法
截取双向链表某一段
在p 后面插入元素 s
假如p->next指向下一个元素x
注意:先把后元素连接 再将前元素连接


第一步:(这一步千万不要倒过来 否则会出错)先把p->next元素(用x 元素代替),
x->prior指针指向x->prior=s ( p->next->prior=s)
x->next(即p->next->next)指针不需要改变

第二步:s->next=x; 到了这一步就实现了p元素与x元素的连接,就不需要再对x进行操作

第三步:p->next=s; 此时p->next不再指向x元素 第三步:p->next=s; 此时p->next不再指向x元素

第四步:s->prior=p; 最后实现了双向链表的插入与连接

双向链表的删除过程
首先先找到要删除的位置
例如p就是要删除的位置
只要将p的前后元素相连 再把p元素释放掉即可删除x
第一步:获取p的前驱元素s=p->prior;

第二步: s->next=p->next;

第三步:p->next->prior=s;
p->next=NULL
p->prior=NULL
free(p);

注意事项:使用c++提交,c提交编译不通过。也不知道是啥原因
参考代码:
#include <stdio.h>
#include <stdlib.h>
/*
解题的方法不用于题目,
插入时使用的是头插法
所以删除,输出操作与题目也不一致
*/
typedef int ElemType;
typedef struct DuLNode{
ElemType data;
struct DuLNode *next;
struct DuLNode *prior;
}DuLNode,*DuLinkList;
void Int_List (DuLinkList &L){
L=(DuLinkList)malloc(sizeof(DuLNode));
L->next=L;
L->prior=L;
}
void printf1(DuLinkList L)//输出的是也要反过来
{
DuLinkList p;
p=L;
while(p->prior!=L)
{
p=p->prior;
printf("%d ",p->data);
}
printf("\n");
}
DuLinkList DuLinkList_getELemp1(DuLinkList L,int i)//寻找删除的元素位置
{
DuLinkList p;
int j=1;
p=L->prior;
while(p!=L && j<i)
{
p=p->prior;
j++;
}
if(p==L && j<i)//位置不合法
return 0;
else
return p;
}
int LinsInsert_DuL(DuLinkList &L,int i,ElemType e)//插入操作 头插法
{
DuLinkList p,s;
p=DuLinkList_getELemp1(L,i);//获取插入位置
if(!p) return 0;//插入的位置不合法
s=(DuLinkList)malloc(sizeof(DuLNode));
if(!s) return 0;
s->data=e;
p->next->prior=s;//第一步操作
s->next=p->next;//第二步
p->next=s;//第三步
s->prior=p;//第四步
return 1;
}
int LinkListdelete_DuL( DuLinkList &L,int i)
{
DuLinkList p,s;
p=DuLinkList_getELemp1(L,i);
if(!p) return 0; //删除的位置不合法
s=p->prior;//获取删除位置的前驱元素 (第一步)
s->next=p->next;//s->next指向p的下一个元素(第二步)
p->next->prior=s;//p的上一个元素指向s(第三步)
p->next=NULL;
p->prior=NULL;
free(p);//释放内存
return 1;
}
int main (){
int a,i,e;
DuLinkList L;
Int_List(L);
while(scanf("%d",&a)!=EOF){
if(a==0)//输出
{
printf1(L);
}
else if(a==1){//插入
scanf("%d %d",&i,&e);
LinsInsert_DuL(L,i,e);
}
else if(a==2){//删除
scanf("%d",&i);
LinkListdelete_DuL(L,i);
}
}
free(L);
return 0;
}0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复