当前位置:   article > 正文

数据结构-双向链表_dl层获取ifpara

dl层获取ifpara

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点

1.初始化

代码

  1. typedef struct DoubleLinkedNode{
  2. char data;
  3. struct DoubleLinkedNode *previous;
  4. struct DoubleLinkedNode *next;
  5. }DLNode, *DLNodePtr;
  6. DLNodePtr initLinkList(){
  7. DLNodePtr tempHeader = (DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
  8. tempHeader->data = '\0';
  9. tempHeader->previous = NULL;
  10. tempHeader->next = NULL;
  11. return tempHeader;
  12. }

                                                                        2.打印链表

  1. void printList(DLNodePtr paraHeader){
  2. DLNodePtr p = paraHeader->next;
  3. while(p != NULL){
  4. printf("%c",p->data);
  5. p = p->next;
  6. }
  7. printf("\r\n");
  8. }

           3.链表的插入

 将p指向需要插入位置的前一位,新建一个q指向需要插入的链表,将q的后继指针指向p的后继指针指向的链表r,q的指针前驱指向p,p的后继指针指向q,如果r不为空,r的前驱指向q,q就成功地插入到了p和r的中间

  1. void insertElement(DLNodePtr paraHeader,char paraChar,int paraPosition){
  2. DLNodePtr p,q,r;
  3. p = paraHeader;
  4. for(int i = 0;i < paraPosition;i++){
  5. p = p->next;
  6. if(p == NULL){
  7. printf("The position %d is beyond the scope of the list.",paraPosition);
  8. return;
  9. }
  10. }
  11. q = (DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
  12. q->data = paraChar;
  13. r = p->next;
  14. q->next = p->next;
  15. q->previous = p;
  16. p->next = q;
  17. if(r != NULL){
  18. r->previous = q;
  19. }
  20. }

4.删除指定元素

  将p指向头指针,将p依次向后移动,直到p的后继等于空,如果p的后继为空的话,就输出无法删除,或者p的后继中的元素是想要删除的元素,就将p的后继令为q,q中的元素就是想要删除的元素,r是q的后继,将p的后继指针指向r,如果r不为空的话,将r的前驱指向p,q中的元素就被删除了

  1. void deleteElement(DLNodePtr paraHeader,char paraChar){
  2. DLNodePtr p,q,r;
  3. p = paraHeader;
  4. while((p->next != NULL)&&(p->next->data != paraChar)){
  5. p = p->next;
  6. }
  7. if(p->next == NULL){
  8. printf("The char '%c' does not exist.\r\n",paraChar);
  9. return;
  10. }
  11. q = p->next;
  12. r = q->next;
  13. p->next = r;
  14. if(r != NULL){
  15. r->previous = p;
  16. }
  17. free(q);
  18. }

5.查找元素的位置

  1. void locateElement(DLNodePtr paraHeader,char paraChar){
  2. DLNodePtr p;
  3. int i=0;
  4. p = paraHeader;
  5. while((p->next != NULL)&&(p->next->data != paraChar)){
  6. p = p->next;
  7. i++;
  8. }
  9. if(p->next == NULL){
  10. printf("The char '%c' is Nofound\n",paraChar);
  11. }
  12. else{
  13. printf("Location of '%c' is '%d'\n",paraChar,i);
  14. }
  15. }

测试结果

双向链表可以找到前驱和后继,可进可退,但是相对单链表需要多分配一个指针存储空间

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

闽ICP备14008679号