#include <iostream>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType *elem; //存储空间的首地址
int length; //表长
int listsize; //表容量
}SqList;
Status InitList_Sq(SqList &L){ //构造一个空的顺序表L,对它进行初始化
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);
L.listsize = LIST_INIT_SIZE;
L.length = 0;
return OK;
}
void DestroyList_Sq(SqList &L){ //销毁顺序表L //?
free(L.elem);
}
void ClearList_Sq(SqList &L){ //清空顺序表L //?
L.length = 0;
}
Status ListEmpty_Sq(SqList L){ //判断顺序表L是否为空 //?
if(L.length == 0) return TRUE;
else return FALSE;
}
int ListLength_Sq(SqList L){ // 判断顺序表L的表长
return L.length;
}
Status GetElem_Sq(SqList L, int pos, ElemType &e){ //获取指定位置的元素(位置从1开始)
if(pos < 1 || pos > L.length) return ERROR;
e = L.elem[pos - 1];
return OK;
}
int LocateElem_Sq(SqList L, ElemType e, Status(*compare)(ElemType, ElemType)){ // 定位顺序表L中第一个与数值e满足关系compare()的元素的位置,若不存在,则返回0
ElemType *p = L.elem;
int pos = 1;
while(pos <= L.length && !compare(e, *p)){
++p;
++pos;
}
if(pos > L.length) return 0;
return pos;
}
// 重点:函数作为参数 实参作为函数名,形参是一个指针类型的变量,它的基类型为函数原型
Status equal(ElemType e1, ElemType e2){
if(e1 == e2) return TRUE;
else return FALSE;
}
// void main(){
// SqList L;
// InitList_Sq(L);
// //......Insert(); //插入元素
// printf("%d", LocateElem_L(L, 3, equal));
// }
Status PriorElem_Sq(SqList &L, ElemType cur_e, ElemType &pre_e){
int pos = LocateElem_Sq(L, cur_e, equal);
if(pos == 1) return ERROR;
pre_e = L.elem[pos - 2];
return OK;
}
Status NextElem_Sq(SqList &L, ElemType cur_e, ElemType &next_e){
int pos = LocateElem_Sq(L, cur_e, equal);
if(pos == L.length) return ERROR;
next_e = L.elem[pos];
return OK;
}
Status ListInsert_Sq(SqList &L, int pos, ElemType e){
if(pos < 1 || pos > L.length + 1) return ERROR;
if(L.length >= L.listsize){
L.elem = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);
L.listsize += LISTINCREMENT;
}
for(ElemType *p = L.elem + L.length - 1; p >= L.elem + pos - 1; --p){
*(p + 1) = *p;
}
ElemType *p = L.elem + pos - 1;
*p = e;
++ L.length;
return OK;
}
Status ListDelete_Sq(SqList &L, int pos, ElemType &e){
if(pos < 1 || pos > L.length) return ERROR;
ElemType *p = L.elem + pos - 1;
e = *p;
for(ElemType *p = L.elem + pos; p < L.elem + L.length; ++p){
*(p - 1) = *p;
}
-- L.length;
return OK;
}
void ListTraverse_Sq(SqList L){ // 此函数只适用于基础数据类型的输出
for(ElemType *p = L.elem; p < L.elem + L.length; ++p){
if(p == L.elem) printf("%d", *p);
else printf(" %d", *p);
}
}
void ListReverse_Sq(SqList &L){
int len = L.length;
for(int i = 0; i < len / 2; ++ i){
ElemType t = L.elem[i];
L.elem[i] = L.elem[len - 1 - i];
L.elem[len - 1 - i] = t;
}
}
//拓展部分
Status ListInsert_SortedSq(SqList &L, ElemType e){
int pos = 1;
while(pos <= L.length){
if(e > L.elem[pos-1]){
++ pos;
}else{
break;
}
}
if(pos > L.length){
L.elem[pos-1] = e;
++L.length;
}else{
for(ElemType *p = L.elem + L.length-1; p >= L.elem+pos-1; -- p){
*(p+1) = *p;
}
L.elem[pos-1] = e;
++ L.length;
}
return OK;
}
/*Status ListInsert_SortedSq(SqList &L, ElemType e){ // 有序顺序表的插入(PTA作业3 6-2)
ElemType *p = L.elem, *p_last = L.elem + L.length - 1;
int pos = 1,len = L.length;
if(L.length == 0){
ListInsert_Sq(L, 1, e);
}else{
while(p <= p_last && *p <= e){
++p;
++pos;
}
ListInsert_Sq(L, pos, e);
}
return OK;
}*/
Status ConditionalListDelete_Sq(SqList &L, ElemType min, ElemType max){ // 适用于一次性删除多个元素 特点:可以在一次遍历的过程中完成所有指定删除操作
ElemType *p = L.elem, *p_last = L.elem + L.length - 1;
int count = 0;
while(p <= p_last){
if(*p > min && *p < max){
++ count;
}else{
*(p - count) = *p;
}
++ p;
}
return OK;
}
void Union_Sq(SqList &La, SqList Lb){ // 集合操作 A U B
ElemType e;
int La_Len = La.length, Lb_Len = Lb.length;
for(int i = 0; i < Lb_Len; i++){
GetElem_Sq(Lb, i + 1, e);
if(!LocateElem_Sq(La, e, equal)){
ListInsert_Sq(La, La_Len+1, e);
++ La_Len;
}
}
}
void MergeList1_SortedSq(SqList La, SqList Lb, SqList &Lc){ // 调用自写基础函数实现版 可含重复元素
int La_Length = La.length, Lb_Length = Lb.length;
ElemType a, b;
InitList_Sq(Lc);
int i = 1, j = 1, k = 1;
while(i <= La_Length && j <= Lb_Length){
GetElem_Sq(La, i, a), GetElem_Sq(Lb, j, b);
if(a < b){
ListInsert_Sq(Lc, ++ k, a);
++ i;
}else{
ListInsert_Sq(Lc, ++ k, b);
++ j;
}
}
while(i <= La_Length){
GetElem_Sq(La, ++ i, a);
ListInsert_Sq(Lc, ++ k, a);
}
while(j <= Lb_Length){
GetElem_Sq(Lb, ++ j, b);
ListInsert_Sq(Lc, ++ k, b);
}
}
void MergeList2_SortedSq(SqList La, SqList Lb, SqList &Lc){ // 自己实现版 可含重复元素
InitList_Sq(Lc);
ElemType *pa = La.elem, *pb = Lb.elem, *pc = Lc.elem;
ElemType *pa_last = La.elem + La.length - 1, *pb_last = Lb.elem + Lb.length - 1;
while(pa <= pa_last && pb <= pb_last){
if(*pa < *pb){
*pc = *pa;
++ pa;
++ pc;
}else{
*pc = *pb;
++ pb;
++ pc;
}
}
while(pa <= pa_last){
*pc = *pa;
++ pa;
++ pc;
}
while(pb <= pb_last){
*pc = *pb;
++ pb;
++ pc;
}
}
void Sub_SortedSq(SqList &La, SqList Lb){ // A - B
ElemType *pa = La.elem, *pa_last = La.elem + La.length - 1, *pb = Lb.elem, *pb_last = Lb.elem + Lb.length - 1;
int pos = 1;
while(pa <= pa_last && pb <= pb_last){
if(*pa < *pb) {
++ pa;
++ pos;
}
else if(*pa == *pb) {
ListDelete_Sq(La, pos, *pa);
++ pb;
}else{
++ pb;
}
}
if(La.length == 0) printf("0");
ListTraverse_Sq(La);
}
// 复现函数库出现的错误
// 1.开辟空间和空间扩容时没有强制类型转换
// 2.扩容时空间首地址写错(错写为结构体L)