基于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++
不为失败找原因,要为成功找方法!
浙公网安备 33010602011771号