標籤:mystra 編程演算法 有序雙迴圈鏈表的插入 代碼 c++
有序雙迴圈鏈表的插入 代碼(C)
本文地址: http://blog.csdn.net/caroline_wendy
有序雙迴圈鏈表的插入, 需要找到插入位置, 可以採用, 兩個指標, 一個在前, 一個在後.
保證前面的小於等於插入值, 後面的大於等於插入值.
特殊情況, 首尾插入(大於或小於整個鏈表)或單節點, 判斷條件為後指標指向首節點. 則需要直接插入.
插入鏈表頭, 需要調整鏈表前端節點.
代碼22行.
代碼:
/* * main.cpp * * Created on: 2014.9.18 * Author: Spike *//*eclipse cdt, gcc 4.8.1*/#include <stdio.h>#include <stdlib.h>using namespace std;struct ListNode {ListNode (int v) {value = v;prev = NULL;next = NULL;}int value;ListNode* prev;ListNode* next;};ListNode* CreateLists() {ListNode* head = new ListNode(0);ListNode* node1 = new ListNode(1);ListNode* node2 = new ListNode(2);ListNode* node4 = new ListNode(4);ListNode* node5 = new ListNode(5);head->prev = node5;head->next = node1;node1->prev = head;node1->next = node2;node2->prev = node1;node2->next = node4;node4->prev = node2;node4->next = node5;node5->prev = node4;node5->next = head;return head;}ListNode* CreateLists2() {ListNode* head = new ListNode(0);head->prev = head;head->next = head;return head;}void Print(ListNode* head) {ListNode* node = head;printf("%d ", node->value);node = node->next;while (node != head) {printf("%d ", node->value);node = node->next;}printf("\n");}ListNode* InsertNode(ListNode* head, ListNode* node) {if (head == NULL || node == NULL)return NULL;ListNode* prevNode = head;ListNode* nextNode = head->next;while(1) {prevNode = prevNode->next;nextNode = prevNode->next;if ((prevNode->value < node->value && nextNode->value >= node->value)|| (nextNode == head)){prevNode->next = node;node->prev = prevNode;nextNode->prev = node;node->next = nextNode;if (node->value < head->value) {head = node;}break;}}return head;}int main (void){ListNode* head = CreateLists();Print(head);ListNode* node = new ListNode(3);ListNode* newList = InsertNode(head, node);Print(newList);return 0;}
輸出:
0 1 2 4 5 0 1 2 3 4 5
編程演算法 - 有序雙迴圈鏈表的插入 代碼(C)