基于C/C++语言数据结构之线性表(二)

链表:

链表的创建与使用:

插入元素:


 

删除元素:

 

 

实现链表:

 

#include<iostream>
// 请在下面实现结点类 Node
class Node {
	public:
		int data;//每节火车车厢人数
		Node* next;//指向下一节点
		Node(int _data) {
			data=_data;
			next=NULL;
		}
};


// 请在下面实现链表类 LinkedList
class LinkedList {
	private:
		Node* head;
	public:
		LinkedList() {
			head=NULL;
		}
		~LinkedList() {
			Node* current_node=head;
			while(current_node!=NULL) {
				Node* delete_node=current_node;
				current_node=current_node->next;
				delete delete_node;
			}


		}
};
int main() {
	LinkedList linkedlist;
	return 0;
}


实现插入方法 insert

void insert(Node *node, int index) {
	if (head == NULL) {
		//链表为空 直接插入
		if (index != 0) {//链表为空 但是不是差到第一个元素
			return;
		}
		head = node;
		return;
	}
	if (index == 0) {//插入到第一个元素 作为头节点
		node->next = head;
		head = node;
		return;
	}
	Node *current_node = head;
	int count = 0;
	while (current_node->next != NULL && count < index - 1) {
		//后移 移动到目标位置
		current_node = current_node->next;
		count++;
	}
	if (count == index - 1) {
		//找到位置进行插入
		node->next = current_node->next;
		current_node->next = node;
	}
}

 


实现输出方法 output

void output() {


	if(head==NULL) {
		return;
	}
	Node* current_node=head;
	while(current_node!=NULL) {
		// 循环输出
		cout<<current_node->data<<" ";
		current_node=current_node->next;


	}
	cout<<endl;
}



实现删除结点方法 delete_node

void delete_node(int index) {
	if(head==NULL) {
		return;


	}
	Node* current_node=head;
	int count=0;
	if(index==0) {
		head=head->next;
		delete current_node;
		return;
	}
	while(current_node->next!= NULL && count<index-1) {
		current_node=current_node->next;
		count++;
	}
	if(count==index-1 && current_node->next!=NULL) {
		Node* delete_node=current_node->next;
		current_node->next=delete_node->next;
		delete delete_node;
	}
}





实现链表的反转方法 reverse

void reverse() {
	if(head==NULL) {
		return;
	}
	Node *next_node, *current_node;
	current_node=head->next;
	head->next=NULL;
	while(current_node!=NULL) {
		next_node=current_node->next;
		current_node->next=head;
		head=current_node;
		current_node=next_node;
	}
}

 

循环链表:

首先我们来了解 循环链表,相比单链表,循环链表不同的是它将最后一个结点的指针指向了头结点,这样的结构使得链表更加灵活方便。循环链表里没有空指针,所以在判断结束条件时,不再是判断指针是否为空,而是判断指针是否等于某固定指针。另外,在单链表里,一个节点只能访问到它后面的结点,而在循环链表里它可以访问到所有的结点。

双向链表:

接下来我们来学习 双向链表,双向链表也叫双链表。单链表里的指针域只记录了结点的下一个结点,也就是后继结点,而双向链表的指针域还记录了结点的上一个结点,也就是前驱结点。有了这样的结构,我们可以从头结点遍历到尾结点,也可以从尾结点遍历到头结点了。


单链表插入元素操作改写为

 

 

循环列表的插入操作:

#include<iostream>
using std::cin;
class Node {
	public:
		int data;
		Node* next;
		Node(int _data) {
			data = _data;
			next = NULL;
		}
};
class LinkedList {
	private:
		Node* head;
	public:
		LinkedList() {
			head = NULL;
		}
		~LinkedList() {
			if(head==NULL) {
				return;
			}


			Node *current_node = head->next;
			head->next=NULL;
			while (current_node != NULL) {
				Node *delete_node = current_node;
				current_node = current_node->next;
				delete delete_node;
			}
		}
		void insert(Node *node, int index) {
			if (head == NULL) {
				if (index != 0) {
					return;
				}
				head = node;
				head->next=head;
				return;
			}
			if (index == 0) {
				node->next = head->next;
				head->next = node;
				return;
			}
			Node *current_node = head->next;
			int count = 0;
			while (current_node!=head && count < index - 1) {
				current_node = current_node->next;
				count++;
			}
			if (count == index - 1) {
				node->next = current_node->next;
				current_node->next = node;
			}
			if(node==head->next) {
				head=node;
			}
		}
};
int main() {
	LinkedList linkedlist;
	int n,m;
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		Node* node=new Node(i);
		linkedlist.insert(node,i-1);
	}
	return 0;
}


循环删除链表元素:

#include<iostream>
using std::cin;
using std::cout;
using std::endl;
class Node {
	public:
		int data;
		Node* next;
		Node(int _data) {
			data = _data;
			next = NULL;
		}
};
class LinkedList {
	private:
		Node* head;
	public:
		LinkedList() {
			head = NULL;
		}
		~LinkedList() {
			if (head == NULL) {
				return;
			}
			Node *current_node = head->next;
			head->next = NULL;
			while (current_node != NULL) {
				Node *delete_node = current_node;
				current_node = current_node->next;
				delete delete_node;
			}
		}
		void insert(Node *node, int index) {
			if (head == NULL) {
				if (index != 0) {
					return;
				}
				head = node;
				head->next = head;
				return;
			}
			if (index == 0) {
				node->next = head->next;
				head->next = node;
				return;
			}
			Node *current_node = head->next;
			int count = 0;
			while (current_node != head && count < index - 1) {
				current_node = current_node->next;
				count++;
			}
			if (count == index - 1) {
				node->next = current_node->next;
				current_node->next = node;
			}
			if (node == head->next) {
				head = node;
			}
		}
		// 请在下面实现输出方法 output_josephus
		void output_josephus(int m) {
			Node* current_node=head;
			head=NULL;
			while(current_node->next!=current_node) {
				for(int i=1; i<m; i++) {
					current_node=current_node->next;


				}
				cout<<current_node->next->data<<" ";
				Node* delete_node=current_node->next;
				current_node->next=current_node->next->next;
				delete delete_node;


			}
			cout<<current_node->data<<endl;
			delete current_node;
		}


};
int main() {
	LinkedList linkedlist;
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		Node *node = new Node(i);
		linkedlist.insert(node, i - 1);
	}
	linkedlist.output_josephus(m);
	return 0;
}

 

版权说明

 

 

著作权归作者所有©。 
商业转载请联系作者获得授权,非商业转载请注明出处。 
本文作者:Joe.Smith

发表日期:2016年10月15日 
本文链接:http://blog.csdn.net/qq_26816591/article/details/52824794

来源:CSDN 
更多内容:基于C/C++语言数据结构之线性表(一)

编译运行环境:dev-c++



posted @ 2016-10-15 19:46  Joe.Smith  阅读(262)  评论(0编辑  收藏  举报