2021-07-14

数据结构(C&C++)

线性表的顺序表示

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#define MaxSize 20
using namespace std;
int Bsearch(int a[],int n,int x);
int main() {
	
	return 0;
}
typedef struct {
	int data[MaxSize];
	int length;
}SqList;
bool ListInsert(SqList &L, int i,int e) {
	if (i<1 || i>L.length+1) {
		printf("Wrong Position!");
		return false;
	}
	if (L.length > MaxSize) {
		printf("Already Full!");
		return false;
	}
	for (int j = L.length; j >= i; j--) 
		L.data[j] = L.data[j - 1];
	L.data[i - 1] = e;
	L.length++;
	return true;
}
bool ListDelete(SqList& L, int i, int& e) {
	if (i<1 || i>L.length) {
		printf("Wrong Position!");
		return false;
	}
	e = L.data[i - 1];
	for (int j = i; j < L.length; j++)
		L.data[j - 1] = L.data[j];
	L.length--;
	return true;
}
int LocateElement(SqList L, int e) {
	for (int i = 0; i < L.length; i++) {
		if (L.data[i] == e);
		return i + 1;
	}
	return 0;
}
bool Delete_Min(SqList& L, int& value) {
	if (L.length == 0) 
		return false;
	int pos = 0;
	value = L.data[0];
	for (int i = 0; i < L.length; i++) {
		if (L.data[i]<value) {
			value = L.data[i];
			pos = i;
		}
		L.data[pos] = L.data[L.length - 1];
		L.length--;
		return true;
	}
}
void Reverse(SqList &L) {
	int temp=0;
	for (int i = 0; i < L.length / 2; i++) {
		L.data[i] = temp;
		temp = L.data[L.length - i - 1];
		L.data[L.length - i - 1] = temp;
	}
}
void Delete_X(SqList& L, int x) {
	int k = 0;
	for (int i = 0; i < L.length; i++) {
		if (L.data[i] != x) {
			L.data[k] = L.data[i];
			k++;
		}
		L.length = k;
	}
}
bool Delete_sTot(SqList& L, int s, int t) {
	if (L.length == 0 || s<0 || t>L.length - 1||s>=t)
		return false;
	int i, j;
	for (i = 0; L.data[i] < s; i++);
	for (j = i; L.data[j] <=t; j++);   //线性表连续的应用,寻找值大于t的第一个元素,用其覆盖s和t之间的元素
	for (; j < L.length; i++,j++) {
		L.data[i] = L.data[j];  //后面的元素前移
	}
	L.length = i;
	return true;
}
bool Delete_s_t(SqList& L, int s, int t) {
	if (L.length == 0 || s<0 || t>L.length - 1 || s >= t) 
		return false;
	int k = 0;  //顺序表中的元素不一定是有序的,需要记录下来
	for (int i = 0; i < L.length; i++) {
		if (L.data[i] >= s && L.data[i] <= t)
			k++;
		else
			L.data[i - k] = L.data[i];
		L.length -= k;
		return true;
	}
}
bool Delete_Same(SqList& L) {
	if (L.length == 0)
		return false;
	int i, j;
	for (i = 0, j = 1; i < L.length; j++) 
		if (L.data[i] != L.data[j])
			L.data[++i] = L.data[j];
	L.length = i + 1;
	return true;
}
bool Merege(SqList L1, SqList L2, SqList& L3) {
	if (L1.length + L2.length > MaxSize)
		return false;
	int i = 0, j = 0, k = 0;
	while (i < L1.length && j < L2.length) {
		if (L1.data[i] < L2.data[j])
			L3.data[k++] = L1.data[i++];
		else
			L3.data[k++] = L2.data[j++];
	}
	while (i < L1.length)
		L3.data[k++] = L1.data[i++];
	while (j < L2.length)
		L3.data[k++] = L2.data[j++];
	L3.length = k;
	return true;
}

//A[m+n],线性表m、n互换
void reverse(int a[], int left, int right, int arrSize) {
	if (left >= right || right >=arrSize)
		return;
	int mid = (left + right) / 2;
	for (int i = 0; i < mid - left; i++) {
		int tmp = a[left + i];
		a[left + i] = a[right - i];
		a[right - i] = tmp;
	}
}
void Exchange(int a[], int m, int n, int arrSize) {
	reverse(a, 0, m + n - 1, arrSize);
	reverse(a, 0, n - 1, arrSize);
	reverse(a, n, m + n - 1, arrSize);
}
void SearchExchangeInsert(SqList L, int x) {
	int low = 0, high = L.length - 1, mid;
	mid = (low + high) / 2;
	while (low<=high)
	{
		if (L.data[mid] == x)
			break;
		else if (L.data[mid] < x)
			low = mid + 1;
		else
			high = mid - 1;
	}
	if (L.data[mid] == x && mid != L.length - 1)
	{
		int tmp = L.data[mid];
		L.data[mid ] = L.data[mid+1];
		L.data[mid+1] = tmp;
	}
	if (low > high) {
		int i = 0;
		for ( i = L.length - 1; i > high; i--)
			L.data[i + 1] = L.data[i];
		L.data[i + 1] = x;
	}
}
void reserve_10(int a[], int from, int to) {
	for (int i = 0; i < (to - from + 1); i++) {
		int tmp = a[from + i];
		a[from + i] = a[to - i];
		a[to - i] = tmp;
	}
}
void Conserve(int a[], int n, int p) {
	reserve_10(a, 0, p - 1);
	reserve_10(a, p, n - 1);
	reserve_10(a, 0, n - 1);
}
int Middle_Search(int a[], int b[], int n) {
	int s1 = 0, d1 = n - 1, m1, s2 = 0, d2 = n - 1, m2;
	while (s1 != d1 || s2 != d2) {
		m1 = (s1 + d1) / 2;
		m2 = (s2 + d2) / 2;
		if (a[m1] == b[m2]) return a[m1];
		if (a[m1] < b[m2]) {
			if ((s1 + m1) % 2 == 0) {
				s1 = m1;
				d2 = m2;
			}
			else {
				s1 = m1 + 1;
				d2 = m2;
			}
		}
		else {
			if ((s2 + d2) % 2 == 0) {
				s2 = m2;
				d1 = m1;
			}
			else {
				s2 = m2 + 1;
				d1 = m1;
			}
		}
	}
	return a[s1] < b[s2] ? a[s1] : b[s2];
}
int Find_Min_Integer(int a[], int n) {
	int i, * b;
	b = (int*)malloc(sizeof(int) * n);
	memset(b, 0, sizeof(int) * n);
	for (i = 0; i < n; i++)
		if (a[i] >= 1 && a[i] <= n)
			b[a[i] - 1] = 0;
	for (i = 0; i < n; i++)
		if (b[i] == 0)
			break;
	return i + 1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值