可执行算法总结(数据结构)
数据结构王道考研第二章:线性表.第二节:线性表的顺序表示第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;
}
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;
}
评论列表 (0 条评论)