数据结构(三)逆序存储链表、数组、顺向建立链表

1、表元素逆序存储链表

代码:

#include<iostream>
using namespace std;

template <typename Object>
struct Node
{
	Object data;
	Node *next;
	Node(const Object & d = Object{}, Node *n = nullptr) :data(d), next(n)
	{}
};
template <typename Object>
Node<Object>*inverse(Node<Object>*head)
{
	Node<Object> *a = head->next;//a指向第一个节点 
	Node<Object> *b;
	head->next = NULL;
	while (a != NULL)
	{
		b = a->next;//b指向a的下一个节点 
		a->next = head->next;// 
		head->next = a;//a反向连接head 
		a = b;//a指向原链表的下一个节点 
	}
	return head->next;//重新指向头结节点,头节点的第一个节点指向head 
}
int main()
{
	typedef Node<int>node;
	node *head = new node;
	node *p, *q;
	int n = 10;
	p = head;
	int v[10];
	for (int i = 0; i < n; i++)
	{
		v[i] = i;
	}
	for (int i = 0; i < n; i++)
	{
		q = new node{ v[i],head };
		p->next = q;
		q->next = NULL;
		p = q;
	}
	p = head->next;

	while (p != nullptr)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
	p = inverse(head);
	while (p != nullptr)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;

	return 0;

}



运行:

2、表元素逆序存储数组

代码:

#include<iostream>
using namespace std;

template <typename Object>
struct Node
{
	Object data;
	Node *next;
	Node(const Object & d = Object{}, Node *n = nullptr) :data(d), next(n)
	{}
};
template <typename Object>
void inverse(Object v[], int N)
{
	for (int i = 0; i < N / 2; i++)
	{
		Object temp;
		temp = v[i];
		v[i] = v[N - i - 1];
		v[N - i - 1] = temp;
	}
}

int main()
{
	typedef Node<int>node;
	node *head = new node;
	node *p, *q;
	int n = 10;
	p = head;
	int v[10];
	for (int i = 0; i < n; i++)
	{
		v[i] = i;
	}
	for (int i = 0; i < n; i++)
	{
		q = new node{ v[i],head };
		p->next = q;
		q->next = NULL;
		p = q;
	}
	p = head->next;

	while (p != nullptr)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
	inverse(v, n);
	p = head;
	for (int i = 0; i < n; i++)
	{
		q = new node{ v[i],head };
		p->next = q;
		q->next = NULL;
		p = q;
	}
	p = head->next;

	while (p != nullptr)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;

	return 0;

}



运行:

3、顺向建立链表

代码:

#include<iostream>
using namespace std;

template <typename Object>
struct Node
{
	Object data;//数据域,用来记录数据 
	Node *next;//指针域,用来记录它的下一个节点的地址,访问这个变量能找到它的下一个节点 
	Node(const Object & d = Object{}, Node *n = nullptr) :data(d), next(n)
	{}
};
int main()
{
	typedef Node<int>node;
	node *head = new node;//开辟内存,地址赋给head,head表示链表的头,访问head能找到这个链表 
	node *p, *q;//p是游动指针,建立链表时永远指向最后一个链节 
	int n = 10;
	p = head;//初始状态下只有head一个链节,那么最后一个链节也是head,让p指向head 
	for (int i = 0; i < n; i++)
	{
		q = new node{ i,head };//给新链节的data赋值 
		p->next = q;//把q挂在p(初始值是head)的后面 
		q->next = NULL;//新链节是链表的最后的一个链节,后面没有后继,把它的next设为null 
		p = q;//q成为p的后继之后,q就是最后一个节点,规定p指向最后一个节点,就把q的值赋给p 
	}
	p = head->next;//p在上面是指向最后一个元素,以便于增加新的链节后能很快的放在它的后面,达到添加链节的目的 
	while (p != nullptr)//NULL是链表结束的标志,当p访问不到NULL时,就会一直循环 
	{
		cout << p->data << " ";//输出p访问到的每个节点的data值 
		p = p->next;//p访问本节点的next值,p就指向下一个节点,就相当于向后移动一个节点 
	}
	cout << endl;
	return 0;

}


运行:

猜你喜欢

转载自blog.csdn.net/RayMa0305/article/details/81381959