JL BLOG CS Lover

链表主要功能实现

2018-05-24
JiefanLee

阅读:


This blog means to provide almost all of the functions of linklist: sort, reverse, remove, insert…

头文件

//linklist.h:定义链表结点和方法。  
#include<iostream>
using namespace std;

struct Node
{
	int val;
	Node \*next;
	Node(int x) :val(x), next(NULL) {}
};

class LinkList
{
public:
	//构造函数  
	LinkList();
	//在链表头部插入结点  
	void InsertHead(int val);
	//插入结点  
	void Insert(int val, int pos);
	//删除结点  
	void Remove(int pos);
	//得到链表长度  
	int Length();
	//链表反序  
	void Reverse();
	//查找结点位置  
	void Find(int val);
	//打印链表  
	void Print();
	//从大到小排序  
	void Sort();
	//析构函数
	~LinkList();
private:
	Node * head;
	int length;
};

功能实现

//linklist.cpp:链表方法的实现。  
#include <iostream>  
#include "linklist.h"  
using namespace std;

LinkList::LinkList()
{
	head = NULL;
	length = 0;
}

LinkList::~LinkList()
{
	Node \*temp;
	for (int i = 0; i < length; i++)
	{
		temp = head;
		head = head->next;
		delete temp;
	}
}

int LinkList::Length()
{
	return length;
}

void LinkList::InsertHead(int val) {
	Insert(val, 0);
}

void LinkList::Insert(int val, int pos) {
	if (pos < 0)
	{
		cout << "The index must be larger than 0!" << endl;
		return;
	}
	int index = 1;
	Node \*temp = head;
	Node \*node = new Node(val);
	if (pos == 0)
	{
		node->next = head;
		head = node;
		length++;
		return;
	}
	while (temp != NULL && index < pos)
	{
		temp = temp->next;
		index++;
	}
	if (temp == NULL)
	{
		cout << "Fail to insert it!" << endl;
		return;
	}
	node->next = temp->next;
	temp->next = node;
	length++;
	return;
}

void LinkList::Remove(int pos)
{
	if (pos < 0 || length < 1)
	{
		cout << "The index must be larger than 0!" << endl;
		return;
	}
	int index = 1;
	Node \*temp = head;
	if (pos == 0 && length == 1)
	{
		head = NULL;
		length--;
		return;
	}
	if (pos == 0 && length > 1)
	{
		head = temp->next;
		length--;
		return;
	}
	while (temp != NULL && index < pos)
	{
		temp = temp->next;
		index++;
	}

	if (temp&&temp->next&&temp->next->next)
	{
		temp->next = temp->next->next;
		length--;
		return;
	}
	cout << "Fail to delete it" << endl;
	return;
}
void LinkList::Sort()
{
	if (length <= 1)
		return;
	Node \*i = head;
	for (; i != NULL; i = i->next)
		for (Node *j = i; j != NULL; j = j->next)
		{
			if (i->val > j->val)
			{
				int temp = i->val;
				i->val = j->val;
				j->val = temp;
			}
		}
	return;
}

void LinkList::Reverse()
{
	if (length <= 1)
		return;
	Node \*pre = new Node(0);
	pre->next = head;
	Node \*cur = head;
	while (cur&&cur->next)
	{
		Node \*move = cur->next;
		cur->next = move->next;
		move->next = pre->next;
		pre->next = move;
	}
	head = pre->next;
	return;
}

void LinkList::Find(int val)
{
	if (length == 0)
	{
		cout << "Not found" << endl;
		return;
	}
	Node \*p = head;
	int index = 1;
	int count = 0;
	while (p)
	{
		if (p->val == val)
		{
			cout << index++ << " ";
			p = p->next;
			count++;
		}
		else
		{
			p = p->next;
			index++;
		}
	}
	if (count == 1)
		cout << "There is " << 1 << " found." << endl;
	else if (count > 1)
		cout << "There are " << count << " found." << endl;
	else
		cout << "Not found" << endl;;
	return;
}

void LinkList::Print()
{
	if (head == NULL)
	{
		cout << "This is an empty LinkList" << endl;
		return;
	}

	Node \*p = head;
	while (p!=NULL)
	{
		cout << p->val << " ";
		p = p->next;
	}
	cout << endl;
	return;
}

Similar Posts

上一篇 Sort

Comments