数据结构与算法——线性表 实验报告及代码

目录

实验目的及要求

实验原理

实验环境

实验方案设计

实验过程

结论(代码)

LinList.h

Main.cpp

 小结


实验目的及要求

1.掌握线性表的概念。

2.掌握线性表的链式存储和基本操作运算。

3.掌握链表的基本操作运算。

4.加深对链式存储实际结构的理解,逐步培养解决实际问题的编程能力。

实验原理

链表的基本操作运算和综合运用

实验环境

Visual studio 2019

实验方案设计

设计一算法,实现两个非递减的线性表的合并,采用链式存储结构,能够输出合并前和合并后链表的内容。

实验过程

1.利用头文件和参考代码,规划进行一定的修改,满足设计的需求。

2.线性表的合并并不需要删除这一操作,所以删除这一部分的代码,因为涉及到合并,所以加入拷贝构造函数和运算符重载。

3.主函数加入一些语句,提高交互性。

结论(代码)

LinList.h

#ifndef _LINLIST_H
#define _LINLIST_H
#include 
using namespace std;
template  class LinList;
template class ListNode {
	friend class LinList;
private:
	ListNode* next;
	T data;
public:
	ListNode(ListNode* ptrNext = NULL) {
		next = ptrNext;
	}
	ListNode(const T& item, ListNode* ptrNext = NULL) {
		data = item;
		next = ptrNext;
	}
	~ListNode(void) {

	}

};
template class LinList {
private:
	ListNode* head;
	int size;
public:
	ListNode* Index(int i);
	LinList(void);
	LinList(LinList& s);
	~LinList(void);
	int Size(void) const;
	void Insert(const T& item, int i);
	T GetData(int i);
	LinList& operator=(const LinList & s)
		{
			head = new ListNode();
			ListNode* p, * q;
			p = s.head->next;
			q = head;
			while (p)
			{
				ListNode* newnode = new ListNode(p->data, q->next);
				p = p->next;
				q->next = newnode;
				q = newnode;
			}
			size = s.size;
			return *this;
		};
	void OrderInsert(T x);
};
template LinList::LinList() {
	head = new ListNode();
	size = 0;
}
templateLinList::LinList(LinList  & s)
{
	head = new ListNode();
	ListNode* p, * q;
	p = s.head->next;
	q = head;
	while (p)
	{
		ListNode* newnode = new ListNode(p->data, q->next);
		p = p->next;
		q->next = newnode;
		q = newnode;
	}
	size = s.size;
};
template LinList::~LinList() {
	ListNode* p, * q;
	p = head;
	while (p != NULL) {
		q = p;
		p = p->next;
		delete q;
	}
	size = 0;
	head = NULL;
}
template int LinList::Size() const {
	return size;
}
template ListNode* LinList::Index(int i) {
	if(i<-1 || i>size - 1) {
		cout << "The index is invalid!" << endl;
		exit(0);
	}
	if (i == -1) return head;
	ListNode* p = head->next;
	int j = 0;
	while (p != NULL && j < i) {
		p = p->next;
		j++;
	}
	return p;
}

template void LinList::Insert(const T& item, int i) {
	if (i<-1 || i>size) {
		cout << "The index is invalid!" << endl;
		exit(0);
	}
	ListNode* p = Index(i - 1);
	ListNode* q = new ListNode(item, p->next);
	p->next = q;
	size++;
}
template T LinList::GetData(int i) {
	if (i<0 || i>size - 1) {
		cout << "The index is invalid!" << endl;
		exit(0);
	}
	ListNode* p = Index(i);
	return p->data;

}
template void LinList::OrderInsert(T x) {
	ListNode* curr, * pre;
	curr = head->next;
	pre = head;

	while (curr != NULL && curr->data <= x) {
		pre = curr;
		curr = curr->next;

	}
	ListNode* q = new ListNode(x, pre->next);
	pre->next = q;
	size++;
}
#endif

Main.cpp

#include
#include"LinList.h"
#include
using namespace std;
template
void Merge(LinList LA, LinList LB, LinList& LC)
{
	T x;
	LC = LA;
	for (int j = 0; j < LB.Size(); j++)
	{
		x = LB.GetData(j);
		LC.OrderInsert(x);
	}
}
int main()
{
	LinList mylistA, mylistB, mylistC;
	int x;
	int temp;
	cout << "创建单链表A" << endl;
	cout << "请输入:(输入零停止)";
	cin >> x;
	while (x != 0)
	{
		mylistA.OrderInsert(x);
		cout << "请输入:(输入零停止)";
		cin >> x;
	}
	cout << "创建单链表B" << endl;
	cout << "请输入:(输入零停止)";
	cin >> x;
	while (x != 0)
	{
		mylistB.OrderInsert(x);
		cout << "请输入:(输入零停止)";
		cin >> x;
	}
	cout << "单链表A:";
	for (int i = 0; i < mylistA.Size(); i++)
		cout << mylistA.GetData(i) << " ";
	cout << "单链表B:";
	for (int i = 0; i < mylistB.Size(); i++)
		cout << mylistB.GetData(i) << " ";
	Merge(mylistA, mylistB, mylistC);
	cout << "合并后的单链表C:";
	for (int i = 0; i < mylistC.Size(); i++)
		cout << mylistC.GetData(i) << " ";
	system("pause");
	return 0;
}

 小结

节点类和链表类的封装,为了访问节点类的私有成员变量,须定义友元链表类。

你可能感兴趣的:(数据结构与算法,c++,算法,数据结构,链表)