SeqList.h
#pragma once
#define ListSize 100
typedef int DataType;
typedef struct {
DataType list[ListSize];
int length;
}SeqList;
void InitList(SeqList* L);/*初始化线性表*/
int ListEmpty(SeqList L);/*判断线性表是否为空,为空返回1,否则返回0*/
int GetElem(SeqList L, int i, DataType* e);/*查找线性表的第i个元素,查找成功将该值返回给e,并返回1表示成功,
否则返回-1表示失败*/
int LocateElem(SeqList L, DataType e);/*查找线性表中元素为e的元素是第多少个元素*/
int InsertList(SeqList* L, int i, DataType e);/*在顺序表的第i个位置插入元素e,插入成功返回1,如果插入的位置不合法,返回-1,顺序表满返回0*/
int DeleteList(SeqList* L, int i, DataType* e);
int ListLength(SeqList L);
void ClearList(SeqList* L);
void MergeList(SeqList A, SeqList B, SeqList* C);
void UnionAB(SeqList* A, SeqList B);/*将B中不在A中的元素插入到A*/
void DelElem(SeqList* A, SeqList B);/*元素在A,B中都存在,在顺序表A中删除该元素*/
void PrintList(SeqList L);
SeqList.cpp
#include<cstdio>
#include"SeqList.h"
void InitList(SeqList* L)
/*初始化线性表*/
{
L->length = 0; /*把线性表的长度置为0*/
}
int ListEmpty(SeqList L)
/*判断线性表是否为空,为空返回1,否则返回0*/
{
if (L.length == 0) {
return 1;
}
else {
return 0;
}
}
int GetElem(SeqList L, int i, DataType* e)
/*查找线性表的第i个元素,查找成功将该值返回给e,并返回1表示成功,
否则返回-1表示失败*/
{
if (i<1 || i>L.length) {
return -1;
}
*e = L.list[i - 1];
return 1;
}
int LocateElem(SeqList L, DataType e)
/*查找线性表中元素为e的元素是第多少个元素*/
{
int i;
for (i = 0; i < L.length; i++) {
if (L.list[i] == e) {
return i + 1;
}
}
return 0;
}
int InsertList(SeqList* L, int i, DataType e)
/*在顺序表的第i个位置插入元素e,插入成功返回1,如果插入的位置不合法,返回-1,顺序表满返回0*/
{
int j;
if (i<1 || i>L->length + 1)/*在插入前,判断插入位置是否合法*/
{
printf("插入的位置i不合法!\n");
return -1;
}
else if (L->length >= ListSize)/*插入之前,判断是否已经满,不能插入元素*/
{
printf("顺序表已满,不能插入元素。\n");
return 0;
}
else {
for (j = L->length; j >= i; j--)/*将第i个位置后的元素一次后移*/
{
L->list[j] = L->list[j - 1];
}
L->list[i - 1] = e;/*插入元素到第i个位置*/
L->length++;
return 1;
}
}
int DeleteList(SeqList* L, int i, DataType* e) {
int j;
if (L->length <= 0) {
printf("顺序表已经不能够进行删除!\n");
return 0;
}
else if (i<1 || i>L->length + 1) {
printf("删除的位置不合法!\n");
return -1;
}
else {
*e = L->list[i - 1];/*获取第i个位置的元素*/
for (j = i; j <= L->length - 1; j++) {
L->list[j - 1] = L->list[j];
}
L->length = L->length - 1;
return 1;
}
}
int ListLength(SeqList L)
{
return L.length;
}
void ClearList(SeqList* L)
{
L->length = 0;
}
void MergeList(SeqList A, SeqList B, SeqList* C) {
int i, j, k;
DataType e1, e2;//用于存储A和B顺序表中的元素
i = 1, j = 1, k = 1;
while (i <= A.length && j <= B.length) {
GetElem(A, i, &e1);
GetElem(B, j, &e2);
if (e1 <= e2) {
InsertList(C, k, e1);/*将较小的元素插入C中*/
i++;/*往后移动一个元素*/
k++;/*C顺序表中待插入位置+1*/
}
else {
InsertList(C, k, e2);
j++;
k++;
}
}
while (i <= A.length)/*这时如果A还有剩余,B中已经没有元素*/ {
GetElem(A, i, &e1);
InsertList(C, k, e1);/*将A中剩余元素插入到C中*/
i++;
k++;
}
while (j <= B.length)/*这时B中还有剩余元素,A中已经没有元素*/ {
GetElem(B, j, &e2);
InsertList(C, k, e2);
j++;
k++;
}
C->length = A.length + B.length;
}
void UnionAB(SeqList* A, SeqList B) {
DataType e;
for (int i = 1; i <= B.length; i++)
{
GetElem(B, i, &e);
if (LocateElem(*A, e) == 0) {
InsertList(A, A->length + 1, e);/*在A的末尾加入元素*/
}
}
}
void DelElem(SeqList* A, SeqList B) {
DataType e;
for (int i = 1; i <= B.length; i++)
{
GetElem(B, i, &e);
int pos = LocateElem(*A, e);
if (pos != 0) {
DeleteList(A, pos, &e);/*A中存在e,则将其删除*/
}
}
}
void PrintList(SeqList L) {
DataType elem;
for (int i = 1; i <= L.length; i++)
{
if (GetElem(L, i, &elem)) {
printf("%4d", elem);
}
}
printf("\n");
}
Test.cpp
void TestSeqList_Merge() {
int i;
DataType a[] = { 8,17,17,25,29 };
DataType b[] = { 3,9,21,21,26,27 };
SeqList A, B, C;/*声明顺序表A,B,C*/
InitList(&A);/*初始化顺序表A, B, C*/
InitList(&B);
InitList(&C);
for (i = 1; i <= sizeof(a) / sizeof(a[0]); i++) {
/*将数组a中的元素插入顺序表A*/
InsertList(&A, i, a[i - 1]);
}
for (i = 1; i <= sizeof(b) / sizeof(b[0]); i++) {
/*将数组b中的元素插入顺序表B*/
InsertList(&B, i, b[i - 1]);
}
printf("顺序表中A的元素:\n");
PrintList(A);
printf("顺序表中B的元素:\n");
PrintList(B);
printf("合并A,B中的元素得到C:\n");
MergeList(A, B, &C);
PrintList(C);
}
void TestSeqList_Union() {
int i;
DataType a[] = { 8,17,25,29 };
DataType b[] = { 3,8,9,21,26,27 };
SeqList A, B, C;/*声明顺序表A,B,C*/
InitList(&A);/*初始化顺序表A, B, C*/
InitList(&B);
InitList(&C);
for (i = 1; i <= sizeof(a) / sizeof(a[0]); i++) {
/*将数组a中的元素插入顺序表A*/
InsertList(&A, i, a[i - 1]);
}
for (i = 1; i <= sizeof(b) / sizeof(b[0]); i++) {
/*将数组b中的元素插入顺序表B*/
InsertList(&B, i, b[i - 1]);
}
printf("顺序表中A的元素:\n");
PrintList(A);
printf("顺序表中B的元素:\n");
PrintList(B);
printf("合并A,B中的元素得到新的A:\n");
UnionAB(&A, B);
PrintList(A);
}
void TestSeqList_Dele() {
int i;
DataType a[] = { 8,17,21,25,27,29 };
DataType b[] = { 3,8,9,21,26,27 };
SeqList A, B, C;/*声明顺序表A,B,C*/
InitList(&A);/*初始化顺序表A, B, C*/
InitList(&B);
InitList(&C);
for (i = 1; i <= sizeof(a) / sizeof(a[0]); i++) {
/*将数组a中的元素插入顺序表A*/
InsertList(&A, i, a[i - 1]);
}
for (i = 1; i <= sizeof(b) / sizeof(b[0]); i++) {
/*将数组b中的元素插入顺序表B*/
InsertList(&B, i, b[i - 1]);
}
printf("顺序表中A的元素:\n");
PrintList(A);
printf("顺序表中B的元素:\n");
PrintList(B);
printf("删除A在B中的元素得到新的A:\n");
DelElem(&A, B);
PrintList(A);
}