チェーンテーブルのソート、チェーンテーブルの削除、最後からk番目のノードへのアクセス


1.先頭ノードの一方向チェーンテーブルのヘッダポインタをheadとし、アルゴリズムを設計し、チェーンテーブルの記録をdataドメインの値に従ってインクリメントソートする.
2.線形テーブルの要素は、単一チェーンテーブルを格納構造として知られている.xより大きくyより小さいテーブル内のすべての要素(テーブルにこのような要素が存在する場合)を削除し、削除されたノード空間を解放するアルゴリズムを書きます.
3.チェーンテーブルの最後からk番目のノードを出力し、tailは最後から0番目のノードである
//

#include "stdafx.h"
#include<iostream>
using namespace std;
template<class T>
struct Node{
	T value;
	Node*next;
};

template<class T>
class list
{
private:
	Node<T>*head;
	Node<T>*tail;
	int len;//    
public:
	list();
	Node<T>*append(T ele);
	Node<T>*findKthfromhead(int k);
	Node<T>*findKthfromtail(int k);
	Node<T>*sort_list(int endpos);//    
	Node<T>*delete_list(T x, T y);//        x   y   (          )
	Node<T>*reverse_list();//  
Node<T>*list<T>::delete_exist();//      
int length();
};

template<class T>
Node<T>*list<T>::reverse_list()
{
<span style="white-space:pre">	</span>int k1 = length()-1;
<span style="white-space:pre">	</span>int k2 = 0;
<span style="white-space:pre">	</span>while (k1 - k2 > 0)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>int mm;
<span style="white-space:pre">		</span>mm = findKthfromhead(k1)->value;
<span style="white-space:pre">		</span>findKthfromhead(k1)->value = findKthfromhead(k2)->value;
<span style="white-space:pre">		</span>findKthfromhead(k2)->value = mm;
<span style="white-space:pre">		</span>--k1;
<span style="white-space:pre">		</span>++k2;
<span style="white-space:pre">	</span>}


<span style="white-space:pre">	</span>return head;
}
template<class T>
Node<T>*list<T>::delete_list(T x, T y)
{
	_ASSERT(y > x);
	_ASSERT(len > 0);

	sort_list(len - 1);
	if (head->value >= y || tail->value <= x)
		return head;
	if (head->value > x)
	{
		Node<T>*m = new Node < T >;
		while (head->value < y)
		{
			Node<T>*node = new Node < T > ;
			node = head;
			if (head->next == NULL)
			{
				head = NULL;
				len = 0;
				return head;
			}
			head->value = head->next->value;
			head = head->next;
			--len;
			delete node;
		}
		return head;
	}
	
	Node<T>*node = new Node < T >;
	Node<T>*m = new Node < T >;
	node = head;
	while (node->value <= x)
	{
		m = node;
		m->value = node->value;
		node = node->next;
	}
	

	while (node->value < y)
	{
		Node<T>*n = new Node < T > ;
		n = node;
		if (node->next == NULL)
		{
			m->next = NULL;
			tail = m;
			--len;
			return head;
		}
		node->value = node->next->value;
		node = node->next;
		--len;
		delete n;
	}
	m->next = node;

	return head;
}
template<class T>
Node<T>*list<T>::sort_list(int endpos)//      
{
	int k = 0;
	int pp;
	if (endpos == 0)
		return head;
	Node<T>*node = new Node < T >;
	node = head;
	while (k < endpos)
	{
		if (node->value > node->next->value)
		{
			pp = node->value;
			node->value = node->next->value;
			node->next->value = pp;
		}
		++k;
		node = node->next;
	}
	--endpos;
	sort_list(endpos);
	//delete node;
}

template<class T>
Node<T>*list<T>::findKthfromhead(int k)
{
	//if (len == 0)
	//	return NULL;
	_ASSERT(k < len);
	Node<T>*KthNode = new Node < T > ;
	KthNode = head;
	while (k)
	{
		KthNode = KthNode->next;
		--k;
	}

	return KthNode;
}

template<class T>
Node<T>*list<T>::findKthfromtail(int k)
{
	_ASSERT(k < len);
	
	return findKthfromhead(len-1-k);
}

template<class T>
int list<T>::length()
{
	return len;
}

template<class T>
Node<T>*list<T>::append(T ele)
{
	if (head == NULL)
	{
		head = new Node < T > ;
		tail = new Node < T >;
		head->value = ele;
		head->next = NULL;
		tail->value = ele;
		tail->next = NULL;
		len = 1;
		return head;
	}
	if (head->next == NULL)
	{
		head->next = tail;
		tail->value = ele;
		tail->next = NULL;
		len = 2;
		return head;
	}
	else
	{
		Node<T>*node = new Node < T > ;
		node->next = NULL;
		node->value = ele;
		tail->next = node;
		tail = node;
		++len;
		return head;
	}
}

template<class T>
list<T>::list()
{
	head = NULL;
	tail = NULL;
	len = 0;
}
template<class T>
Node<T>*list<T>::delete_exist()
{
<span style="white-space:pre">	</span>sort_list(len - 1);
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>Node<T>* node,*n,*m;


<span style="white-space:pre">	</span>n=node = head;
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>while (node->next != NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>
<span style="white-space:pre">		</span>if (node->value == node->next->value)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>while (node->next != NULL&&node->value == node->next->value)
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>m = node;
<span style="white-space:pre">				</span>node = node->next;


<span style="white-space:pre">				</span>delete m;
<span style="white-space:pre">				</span>--len;
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>n->next = node;
<span style="white-space:pre">			</span>node = node->next;
<span style="white-space:pre">			</span>
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>else
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>n = node;
<span style="white-space:pre">			</span>node = node->next;


<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>/*
<span style="white-space:pre">	</span>while (node->next != NULL)
<span style="white-space:pre">	</span>{


<span style="white-space:pre">		</span>m = n->next;
<span style="white-space:pre">		</span>m->value = n->next->value;
<span style="white-space:pre">		</span>while (n->value == n->next->value)
<span style="white-space:pre">		</span>{


<span style="white-space:pre">			</span>m = n;
<span style="white-space:pre">			</span>m->value = n->value;
<span style="white-space:pre">			</span>n->value = n->next->value;
<span style="white-space:pre">			</span>n = n->next;
<span style="white-space:pre">			</span>if (n->next == NULL)
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>//delete m;  
<span style="white-space:pre">				</span>--len;
<span style="white-space:pre">				</span>return head;
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>//delete m;  
<span style="white-space:pre">			</span>--len;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>node->next = m;
<span style="white-space:pre">		</span>node->next->value = m->value;


<span style="white-space:pre">		</span>n = n->next;
<span style="white-space:pre">		</span>n->value = n->next->value;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>*/


<span style="white-space:pre">	</span>return head;


}
int _tmain(int argc, _TCHAR* argv[])
{
	list<int>aa;
	aa.append(6);
	cout <<"   "<< aa.length() << endl;
	aa.append(5);
	cout << "   " << aa.length() << endl;
	aa.append(4);
	cout << "   " << aa.length() << endl;
	aa.append(3);
	cout << "   " << aa.length() << endl;
	aa.append(2);
	cout << "   " << aa.length() << endl;
	cout <<"     "<< aa.findKthfromhead(3)->value << endl;
	cout << "       " << aa.findKthfromtail(3)->value << endl;
	aa.sort_list(aa.length() - 1);
	//aa.delete_list(1, 7);
	aa.delete_list(1, 4);
	cout << "   " << aa.length() << endl;
	for (int i = 0; i < aa.length(); i++)
		cout << aa.findKthfromhead(i)->value << endl;

	system("pause");
	return 0;
}