实验一(1)顺序表
// 算法与数据结构实验一-顺序表 by 022116213 陈松
/*1.已知有两个按元素值递增有序的顺序表A和B,设计一个算法将表A和表B的全部元素归并为一个按元素值递增有序的顺序表C。
要求: 从键盘输入顺序表A和B的各元素,编程实现上述算法,输出顺序表A、顺序表B和顺序表C 的所有元素值 。
2.已知线性表A按顺序存储,且每个元素都是互不相等的整数。
编程实现把所有偶数移到所有的奇数前边的算法。
要求:
(1)时间最少,辅助空间最少;
(2)线性表A的各元素初始值从键盘输入;
(3)输出结果。*/
#include <iostream>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define maxsize 100 //定义表最大容量
using namespace std;
typedef int elemtype;
typedef int stutas;
typedef struct
{
elemtype* data; //定义表容量
int len; //定义表的长度
int size;
}sqlist;
//初始化顺序表
int intlist_sq(sqlist* L)
{
L->data = (elemtype*)malloc(maxsize * sizeof(elemtype));//申请顺序表的使用空间
if (!L->data) //判断申请是否成功
{
printf("分配失败!");
return -1;
}
L->len = 0; //初始化顺序表
L->size = maxsize;
printf("顺序表%L已初始化!\n", &L);
return 1;
}
//销毁顺序表
int deletelist(sqlist& L)
{
if (L.data == NULL)
{
printf("线性表为空!\n");
return 0;
}
free(L.data);
L.len = 0;
L.size = 0;
printf("已成功销毁顺序表%L!\n", &L);
return 1;
}
//创建按值递增顺序表
void createlist(sqlist& L)
{
int x, i = 0;
printf("请输入表%L的长度: ", &L);
scanf_s("%d", &L.len);
printf("输入要填入表的元素:\n");
for (; i < L.len; i++)
{
printf("表中第%d个元素:\n", i + 1);
scanf_s("%d", &x);
L.data[i] = x;
}
}
void printflist(sqlist& L)
{
int i, j;
for (i = 1; i <= L.len; i++)
{
j = L.data[i - 1];
printf("第%d个元素是:%d \n", i, j);
}
}
//将两个按值递增的顺序表A,B归并到一个新按值递增的顺序表C中方法
void merge(sqlist A, sqlist B, sqlist& C)
{
int i = 0, j = 0, k = 0;
while (i < A.len && j < B.len) //A和B都没有读完时
{
if (A.data[i] < B.data[j])
{
C.data[k] = A.data[i];
i++;
}
else
{
C.data[k] = B.data[j];
j++;
}
k++;
}
while (i < A.len) //A没有读完时
{
C.data[k] = A.data[i];
k++; i++;
}
while (j < B.len) //B没有读完时
{
C.data[k] = B.data[j];
k++; j++;
}
C.len = k;
}
void Move(sqlist& L) //把所有偶数移到所有的奇数前边
{
int i = 0, j = L.len - 1;
while (i < j)
{
while (L.data[i] % 2 == 0) i++;
while (L.data[j] % 2 == 1) j--;
if (i < j) swap(L.data[i], L.data[j]);
}
return;
}
void main( )//将表A和表B的全部元素归并为一个按元素值递增有序的顺序表C。
{
sqlist A, B, C;
intlist_sq(&A);
intlist_sq(&B);
intlist_sq(&C);
printf("请输入表A的元素:\n");
createlist(A);
printflist(A);
printf("请输入表B的元素:\n");
createlist(B);
printflist(B);
merge(A,B,C)
printf("归并后表C中的元素:\n");
printflist(C);
}
void main( )//把所有偶数移到所有的奇数前边
{
sqlist A;
intlist_sq(&A);
printf("请输入表A的元素:\n");
createlist(A);
printflist(A);
printf("将所有偶数移到奇数前后:\n");
Move(A);
printflist(A);
}