当前位置:   article > 正文

双向链表的删除和插入_双向链表插入

双向链表插入

一、初始操作

双向链表定义如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct DLnode{
  4. int data;
  5. struct DLnode *prev,*next;
  6. }DLnode,*DLinklist;

尾插法创建:

  1. void Create(DLinklist &L){
  2. L=(DLinklist)malloc(sizeof(DLnode));
  3. L->next=NULL;
  4. DLnode *s,*p=L;
  5. int n,num;
  6. printf("请输入要创建的个数:");
  7. scanf("%d",&num);
  8. for(int i=1;i<=num;i++){
  9. printf("请输入第%d个元素的值:",i);
  10. scanf("%d",&n);
  11. s=(DLinklist)malloc(sizeof(DLnode));
  12. s->data=n;
  13. p->next=s;
  14. p=s;
  15. p->next=NULL;
  16. }
  17. printf("创建成功!\n");
  18. }

二、双向链表的插入

整体代码:

  1. //双向链表的插入
  2. int Insert(DLinklist L){
  3. DLinklist s,p;
  4. int n;
  5. int data;
  6. printf("请输入要插入的位置:");
  7. scanf("%d",&n);
  8. printf("请输入要插入的元素:");
  9. scanf("%d",&data);
  10. p=Find(L,n); //函数找到删除节点的序号
  11. if(!p){
  12. printf("位置错误!");
  13. return -1;
  14. }else{
  15. s=(DLinklist)malloc(sizeof(DLnode));
  16. s->data=data;
  17. s->prev=p->prev;
  18. p->prev->next=s;
  19. s->next=p;
  20. p->prev=s;
  21. printf("插入成功!");
  22. return 1; }
  23. }

对于这个插入操作的执行顺序个人当初想的与各个教材的有所不同;

 

 教材参考代码:

①:s->prev=p->prev;

②:  p->prev->next=s;

③:  s->next=p;

④:p->prev=s;

  个人觉得对于一个新节点首先要确定它本身的前后指针,应该先进行1,3操作改变新节点的前后指针.

  然后在进行2操作最后进行4操作;但是这两个顺序是不能改变的。

 原因:4操作是将p的prev指针指向s,如果先进行4则前驱结点的next值将无法操作!

三、双向链表的删除

整体代码:

  1. //双向链表的删除
  2. void Delate(DLinklist &L){
  3. DLinklist s;
  4. int num;
  5. printf("请输入要删除结点的位置:");
  6. scanf("%d",&num);
  7. if(num!=NULL){
  8. s=Find(L,num) ; //函数找到删除节点的序号
  9. s->prev->next=s->next;
  10. s->next->prev=s->prev;
  11. free(s);
  12. printf("删除成功!");
  13. }
  14. }

代码:

①:p->prev->next=p->next;

②:p->next->prev=p->prev;

此顺序可以交换。

四、总结

 双向链表由于有一个前驱指针,所以方便了许多单链表的操作,例如:插入和删除,不需要申请过多的指针来进行前驱结点的遍历,但是额外增加了空间上的负担,有利有弊,酌情处理。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/456456
推荐阅读
相关标签
  

闽ICP备14008679号