linkedlist.cc

来自「蒙特卡洛仿真源代码很有参考价值要按照步骤进行操作」· CC 代码 · 共 371 行

CC
371
字号
// LinkedList.cc for Blackbox - an X11 Window manager// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)//// Permission is hereby granted, free of charge, to any person obtaining a// copy of this software and associated documentation files (the "Software"),// to deal in the Software without restriction, including without limitation// the rights to use, copy, modify, merge, publish, distribute, sublicense,// and/or sell copies of the Software, and to permit persons to whom the// Software is furnished to do so, subject to the following conditions://// The above copyright notice and this permission notice shall be included in// all copies or substantial portions of the Software.//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER// DEALINGS IN THE SOFTWARE.// stupid macros needed to access some functions in version 2 of the GNU C// library#ifndef   _GNU_SOURCE#define   _GNU_SOURCE#endif // _GNU_SOURCE#include "LinkedList.hh"#ifdef    HAVE_CONFIG_H#  include "config.h"#endif // HAVE_CONFIG_H#ifdef    HAVE_STDIO_H#  include <stdio.h>#endif // HAVE_STDIO_H__llist_iterator::__llist_iterator(__llist *l){	// initialize the iterator...	list = l;	if (list) {		if (! list->iterators)			list->iterators = new __llist;		list->iterators->insert(this);	}	reset();}__llist_iterator::~__llist_iterator(void){	if (list && list->iterators)		list->iterators->remove(this);}void *__llist_iterator::current(void){	// return the current node data... if any	return ((node) ? node->getData() : 0);}void __llist_iterator::reset(void){	// update the iterator's current node to the first node in the linked list	if (list)		node = list->_first;}const int __llist_iterator::set(const int index){	// set the current node to index	if (list) {		if (index < list->elements && index >= 0 && list->_first) {			node = list->_first;			for (register int i = 0; i < index; i++)				node = node->getNext();			return 1;		}	}	node = (__llist_node *) 0;	return 0;}void __llist_iterator::operator++(void){	// iterate to the next node in the list...	node = ((node) ? node->getNext() : 0);}void __llist_iterator::operator++(int){	// iterate to the next node in the list...	node = ((node) ? node->getNext() : 0);}__llist::__llist(void *d){	// initialize the linked list...	_first = (__llist_node *) 0;	_last = (__llist_node *) 0;	iterators = (__llist *) 0;	elements = 0;	if (d) insert(d);}__llist::~__llist(void){	// remove all the items in the list...	for (register int i = 0, r = elements; i < r; i++)		remove(0);	if (iterators) {		__llist_node *n = iterators->_first;		while (n) {			((__llist_iterator *) n->getData())->list = (__llist *) 0;			((__llist_iterator *) n->getData())->node = (__llist_node *) 0;			n = n->getNext();		}		delete iterators;	}}const int __llist::insert(void *d, int index){	// insert item into linked list at specified index...	if ((! _first) || (! _last)) {		// list is empty... insert the item as the first item, regardless of the		// index given		_first = new __llist_node;		_first->setData(d);		_first->setNext((__llist_node *) 0);		_last = _first;	} else {		if (index == 0) {			// if index is 0... prepend the data on the list			__llist_node *nnode = new __llist_node;			nnode->setData(d);			nnode->setNext(_first);			_first = nnode;		} else if ((index == -1) || (index == elements)) {			// if index is -1... append the data on the list			__llist_node *nnode = new __llist_node;			nnode->setData(d);			nnode->setNext((__llist_node *) 0);			_last->setNext(nnode);			_last = nnode;		} else if (index < elements) {			// otherwise... insert the item at the position specified by index			__llist_node *nnode = new __llist_node, *inode = _first->getNext();			if (! nnode)				return -1;			nnode->setData(d);			for (register int i = 1; i < index; i++)				if (inode)					inode = inode->getNext();				else {					delete nnode;					return -1;				}			if ((! inode) || inode == _last) {				nnode->setNext((__llist_node *) 0);				_last->setNext(nnode);				_last = nnode;			} else {				nnode->setNext(inode->getNext());				inode->setNext(nnode);			}		}	}	return ++elements;}const int __llist::remove(void *d){	// remove list item whose data pointer address matches the pointer address	// given	if ((! _first) || (! _last))		return -1;	else if (_first->getData() == d) {		// remove the first item in the list...		__llist_node *node = _first;		_first = _first->getNext();		if (iterators && iterators->_first) {			__llist_node *n = iterators->_first;			while (n) {				((__llist_iterator *) n->getData())->reset();				n = n->getNext();			}		}		--elements;		delete node;		return 0;	} else {		// iterate through the list and remove the first occurance of the item		// NOTE: we don't validate _first in this assignment, because it is checked		// for validity above...		__llist_node *rnode = _first->getNext(), *prev = _first;		for (register int i = 1; i < elements; i++)			if (rnode)				if (rnode->getData() == d) {					// we found the item... update the previous node and delete the					// now useless rnode...					prev->setNext(rnode->getNext());					if (rnode == _last)						_last = prev;					if (iterators && iterators->_first) {						__llist_node *n = iterators->_first;						while (n) {							((__llist_iterator *) n->getData())->reset();							n = n->getNext();						}					}					--elements;					delete rnode;					return i;				} else {					prev = rnode;					rnode = rnode->getNext();				}		return -1;	}}void *__llist::remove(const int index){	if (index >= elements || index < 0 || (! _first) || (! _last))		return (void *) 0;	// remove list item at specified index within the list	if (index == 0) {		// remove the first item in the list...		__llist_node *node = _first;		void *data_return = _first->getData();		_first = _first->getNext();		if (iterators && iterators->_first) {			__llist_node *n = iterators->_first;			while (n) {				((__llist_iterator *) n->getData())->reset();				n = n->getNext();			}		}		--elements;		delete node;		return data_return;	} else {		__llist_node *rnode = _first->getNext(), *prev = _first;		void *data_return = (void *) 0;		for (register int i = 1; i < index; i++)			if (rnode) {				prev = rnode;				rnode = rnode->getNext();			} else				return (void *) 0;		if (! rnode) return (void *) 0;		prev->setNext(rnode->getNext());		data_return = rnode->getData();		if (rnode == _last)			_last = prev;		if (iterators && iterators->_first) {			__llist_node *n = iterators->_first;			while (n) {				((__llist_iterator *) n->getData())->reset();				n = n->getNext();			}		}		--elements;		data_return = rnode->getData();		delete rnode;		return data_return;	}	return (void *) 0;}void *__llist::find(const int index){	if (index >= elements || index < 0 || (! _first) || (! _last))		return (void *) 0;	if (index == 0) {		// return the first item		return first();	} else if (index == (elements - 1)) {		// return the last item		return last();	} else {		__llist_node *fnode = _first->getNext();		for (register int i = 1; i < index; i++)			if (fnode)				fnode = fnode->getNext();			else				return (void *) 0;		return fnode->getData();	}	return (void *) 0;}void *__llist::first(void){	if (_first)		return _first->getData();	return (void *) 0;}void *__llist::last(void){	if (_last)		return _last->getData();	return (void *) 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?