编程算法 - 有序双循环链表的插入 代码(C)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程算法 - 有序双循环链表的插入 代码(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 head;
	ListNode* prevNode = head;
	ListNode* nextNode = head->next;
	while(1) {
		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;
		}
		prevNode = prevNode->next;
		nextNode = prevNode->next;
	}
	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)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构编程实验

顺序表和链表的基本操作,用C语言实现!

数据结构与算法--必知必会

#yyds干货盘点# 有序链表的基本用法

数据结构和算法学编程必知必会的50个代码实现,你都会了吗?

有序的双链表的实现