1.元素逆置

2.从有序顺序表中删除所有其值重复的元素

3.将两个有序顺序表合并为一个新的有序表


1.元素逆置

数据结构王道考研第二章:线性表.第二节:线性表的顺序表示18,第二.8

,综合应用题8:已知在一维数组A[m+n]中依次存放两个线性表(a1, a2, 3,. am)和(b1, b2, b....).将数组中两个顺序表的位置互换

算法思想:首先将数组A[m+n]中的全部元素 (a1, a2, a3, , am, bi, b2, b3, , bn) 原地逆置为 (bn, bn-1, bn-2, , b1, am, am-1, am-2, , a1),再对前n个元素和后m个元素分别使用逆置算法,就可以得到(b1, b2, b3, , bn, a1, a2, a3, , am),从而实现顺序表的位置互换。

本题代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define InitSize 100
typedef int ElemType;

void Reserve(ElemType A[], int left, int right, int arraySize) {
	if (left >= right || right >= arraySize)
		return;
	int mid = (left + right) / 2;
	for (int i = 0; i <= mid - left; i++) {
		ElemType temp = A[left + i];
		A[left + i] = A[right - i];
		A[right - i] = temp;
	}
}

void Exchange(ElemType A[], int m, int n, int arraySize) {
	Reserve(A, 0, m + n - 1, arraySize); 
	Reserve(A, 0, n - 1, arraySize);
	Reserve(A, n, m + n - 1, arraySize);
}

int main() {
	int A[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("生成前顺序表:");
	for (int m = 0; m < 10; m++) {
		printf("%5d", A[m]);
	}
	printf("\r\n");
	Exchange(A, 5, 5, 10);
	printf("改变后顺序表:");
	for (int m = 0; m < 10; m++) {
		printf("%5d", A[m]);
	}
}

 

2.从有序顺序表中删除所有其值重复的元素
c++版

#include<iostream>
using namespace std;

int main()
{
	int arr[10] = { 1,1,2,2,3,3,3,5,5,5 }, i, k;
	for (k = 0, i = 1; i < 10; i++)
		if (arr[k] != arr[i])
			arr[++k] = arr[i];
	k++;
	for (i = 0; i < k; i++)
		cout << arr[i] << " ";
	cout<<endl;
	system("pause");
	return 0;
}

c语言版

#include<stdio.h>

int main()
{
	int arr[10] = { 1,1,2,2,3,3,3,5,5,5 };
	int k=0;
	for (int i = 1; i < 10; i++)
	{
		if (arr[k] != arr[i])
		{
			//printf("除了第一个后面非重复元素:%d \n", arr[i]);
			arr[++k] = arr[i];
			
		}
	}
	k++;
	//printf("元素的个数:%d \n", k);
	for (int i = 0; i < k; i++)
		printf("%d ", arr[i]); //遍历存储在数组中不重复元素
	return 0;
}

3.将两个有序顺序表合并为一个新的有序表

7.将两个有序顺序表合并成一个新的有序顺序表,并由函数返回结果顺序表。

#include<iostream>
using namespace std;

#define MaxSize 100

//将两个有序顺序表合并为一个新的有序表,并由函数返回结果顺序表 
typedef struct {
	int data[MaxSize];
	int Length;
}SqList;

//1.保证顺序表A+顺序表B的长度不超过MaxSize 
//2.两个指针分别指向A,B,判断指针所指向值的大小,更小的值赋给顺序表C,指针k指向表C 
//3.表A,B长度不相等,一个表扫描完后,另一个表剩余元素全部赋给C 
bool merge(SqList A, SqList B, SqList& C) {
	if (A.Length + B.Length > MaxSize)
		return false;
	int i = 0, j = 0, k = 0;//指向表A,B,C的指针 
	while (i < A.Length && j < B.Length) {
		if (A.data[i] <= B.data[j])
			C.data[k++] = A.data[i++];
		else
			C.data[k++] = B.data[j++];
	}

	while (i < A.Length)//表B扫描完
		C.data[k++] = A.data[i++];
	while (j < B.Length)//表A扫描完
		C.data[k++] = B.data[j++];

	C.Length = k;
	return true;
}

int main() {
	SqList LA, LB, LC;//定义顺序表

	cout << "请输入数组A和B的长度:";
	cin >> LA.Length >> LB.Length;

	cout << "请输入数组A的值:";
	for (int i = 0; i < LA.Length; i++)
	{
		cin >> LA.data[i];
	}

	cout << "请输入数组B的值:";
	for (int i = 0; i < LB.Length; i++)
	{
		cin >> LB.data[i];
	}

	merge(LA, LB, LC);

	cout << "合并后的数组为";
	for (int i = 0; i < LC.Length; i++)
		cout << LC.data[i] << " ";
	cout << endl;
	return 0;
}