数据结构 线性表算法(一)

数据结构 线性表算法(一)

实现线性表的一些基础算法,包括:
插入,删除,合并,合并排序线性表

// 线性表算法.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 这个文件主要用于实现一些线性表的功能,包括顺序线性表,静态链表,循环链表,双向链表
// 以及一个用链表实现的多项式
// 为了方便和演示算法,顺序线性表直接使用了C++ STL库中的vector

#include "pch.h"
#include 
#include 
using namespace std;


/*
	插入:把目标data插入到指定pos的后面,如果要从头部插入,输入的pos需要是-1
	args:
		A为目标线性表
		pos为插入的位置
		data为插入的数据
*/
void insert(vector &A, int pos, int data) {
	if (pos < -1 || pos > A.size())
		return;
	if (pos == A.size()) {
		A.resize(A.size() + 1);
		A[pos] = data;
		return;
	}
	A.resize(A.size() + 1);
	
	for (int i = A.size()-1; i >= pos+2; i--) // 1 2 3 4 5-> 1 2 2 3 4 5
		A[i] = A[i - 1];
	
	A[pos + 1] = data;
}


/*
	删除线性表A中第pos个元素	
*/
void Delete(vector &A, int pos) {
	if (pos < 0 || pos > A.size())
		return;
	for (int i = pos; i < A.size() - 1; i++)
		A[i] = A[i + 1];
	A.resize(A.size() - 1);
}

/*
	合并两个线性表
	把线性表B拼接到线性表A后面
*/
void Merge(vector &A, vector &B) {
	int m = A.size(), n = A.size() + B.size();
	A.resize(n);
	for (int i = m; i < n; i++)
		A[i] = B[i-m];		//其实这里可以使用push_back函数,但是在这里我尽量避免使用STL库自带的函数
}

/*	
	合并两个排序的线性表,保证合并之后还是排序的
	这里使用了一个新的线性表来保存
	如果要设置没有重复元素只需要判断A[i] == B[j]时,只加入1个元素,并且i,j同时右移
*/
vector Merge_sorted(const vector &A, const vector &B) {
	vector res(A.size() + B.size(), 0);
	int i = 0, j = 0, k = 0;
	while (i < A.size() && j < B.size()) {
		if (A[i] <= B[j]) {
			res[k] = A[i];
			k++;
			i++;
		}
		else {
			res[k] = B[j];
			k++;
			j++;
		}
	}
	while (i < A.size()) {
		res[k] = A[i];
		i++;
		k++;
	}
	while (j < B.size()) {
		res[k] = B[j];
		k++;
		j++;
	}
	return res;
}

// 输出一个线性表的内容
void printVector(const vector &tar) {
	for (int i = 0; i < tar.size(); i++)
		cout << tar[i] << " ";
	cout << endl;
}


int main()
{
	vector A = { 1, 3, 3, 5, 7};
	vector B = {9};
	printVector(A);
	Merge(A, B);
	printVector(A);
	printVector(Merge_sorted(A, B));
	insert(A, 0, 2);
	printVector(A);
	Delete(A, 1);
	printVector(A);
}



你可能感兴趣的:(数据结构)