双向链表的学习
双向链表的插入,查找,删除。
双向链表相较于单项链表的好处是能够快捷的操作前驱和后继,氪金可退不过缺点是分配的空间更大。双向链表的结点由指向前面结点指针、数据和指向后面结点的指针组成
双向链表
链表的插入

插入代码
void insertElement(DLNodePtr paraHeader, char paraChar, int paraPosition){DLNodePtr p,q,r;p = paraHeader;for(int i=0;i < paraPosition;i++){p = p->next;if(p == NULL){printf("超出该位置\r\n");return ; }//判断插入位置是否越界 }//寻找插入的位置 r = p->next;q = (DLNodePtr)malloc(sizeof(DLNode));q->data = paraChar;//创建新的结点 q->next = p->next;p->next = q;q->previous = p;//插入 if(r!=NULL){r->previous = q;//判断插入的结点是否是尾结点 }}//插入函数
链表的删除

找到目标储存元素的结点 另p->previous->next = p->next; p->next->previous = p->previous;free(p)即可删除目标元素
实现代码
void deleteElement(DLNodePtr paraHeader, char paraChar){DLNodePtr p;p = paraHeader;while(p->next != NULL ){if(p->data ==paraChar){p->previous->next = p->next;p->next->previous = p->previous;free(p);return ;}//判断是否相等并删除 else{p = p->next; }}if(p->next == NULL){printf("没有该元素可以删除\r\n"); return;}//判断是否存在该元素}//删除函数
链表的查找
遍历链表找到目标元素,同时记录其位于第几个位置
代码
void locateElement(DLNodePtr paraHeader,char paraChar){DLNodePtr p;int i = 0,x=0;p = paraHeader ;//找出目标元素的所有位置 while(p!=NULL){if(p->data == paraChar){printf("链表第%d位是%c\n",i,paraChar);x++;}i++;p = p->next; }//判断链表中是否存在目标元素 if(x==0){printf("%c不存在于该链表中\n",paraChar); }
}
完整代码
#include
#include typedef struct DoubleLinkedNode{char data;struct DoubleLinkedNode *previous;struct DoubleLinkedNode *next;}DLNode,*DLNodePtr;DLNodePtr initLinkList(){DLNodePtr tempeHeader = (DLNodePtr)malloc(sizeof(DLNode));tempeHeader->data = '\0';tempeHeader->previous = NULL;tempeHeader->next = NULL;return tempeHeader;}//链表的初始化 void printList(DLNodePtr paraHeader){DLNodePtr p;p = paraHeader ;while(p !=NULL){printf("%c",p->data);p = p->next;}printf("\r\n");}//打印链表 void insertElement(DLNodePtr paraHeader, char paraChar, int paraPosition){DLNodePtr p,q,r;p = paraHeader;for(int i=0;i < paraPosition;i++){p = p->next;if(p == NULL){printf("超出该位置\r\n");return ; }//判断插入位置是否越界 }//寻找插入的位置 r = p->next;q = (DLNodePtr)malloc(sizeof(DLNode));q->data = paraChar;//创建新的结点 q->next = p->next;p->next = q;q->previous = p;//插入 if(r!=NULL){r->previous = q;//判断插入的结点是否是尾结点 }}//插入函数 void deleteElement(DLNodePtr paraHeader, char paraChar){DLNodePtr p;p = paraHeader;while(p->next != NULL ){if(p->data ==paraChar){p->previous->next = p->next;p->next->previous = p->previous;free(p);return ;}//判断是否相等并删除 else{p = p->next; }}if(p->next == NULL){printf("不存在%c可以删除\r\n",paraChar); return;}}//删除函数
void locateElement(DLNodePtr paraHeader,char paraChar){DLNodePtr p;int i = 0,x=0;p = paraHeader ;//找出目标元素的所有位置 while(p!=NULL){if(p->data == paraChar){printf("链表第%d位是%c\n",i,paraChar);x++;}i++;p = p->next; }//判断链表中是否存在目标元素 if(x==0){printf("%c不存在于该链表中\n",paraChar); }}void insertDeleteTest(){DLNodePtr tempList = initLinkList();printList(tempList);insertElement(tempList, 'H', 0);insertElement(tempList, 'e', 1);insertElement(tempList, 'l', 2);insertElement(tempList, 'l', 3);insertElement(tempList, 'o', 4);insertElement(tempList, '!', 5);printList(tempList);locateElement(tempList, 'H');locateElement(tempList, 'l');locateElement(tempList, 'x');deleteElement(tempList, 'e');deleteElement(tempList, 'a');deleteElement(tempList, 'o');printList(tempList);insertElement(tempList, 'o', 1);printList(tempList);
}// 测试函数void basicAddressTest(){DLNode tempNode1, tempNode2;tempNode1.data = 4;tempNode1.next = NULL;tempNode2.data = 6;tempNode2.next = NULL;printf("The first node: %d, %d, %d\r\n",&tempNode1, &tempNode1.data, &tempNode1.next);printf("The second node: %d, %d, %d\r\n",&tempNode2, &tempNode2.data, &tempNode2.next);tempNode1.next = &tempNode2;
}// 地址测试函数 int main(){insertDeleteTest();basicAddressTest();
}
测试结果

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
