本博文源于严蔚敏老师的书籍《数据结构》,看到今天有个实验二,我立马写了一下,并分享到博客里,代码由Clion编译器完全可执行。完整的题目如下:
题目再现
写一个主程序来上机设计并验证线性表顺序表示的所有操作
(至少包含算法2.3、2.4、2.5),并设计一个算法删除所有值大于min而且小于max的元素。
题目分析
- 2.3 是一个线性表的插入
- 2.4 是一个线性表的删除
- 2.5是一个线性表的查找
- 自己设计的是一个删除函数(给出两种方法)
2.3 线性表插入
线性表插入,就是值往后挪的过程,我们按照书上的进行书写就行了。
Status ListInsert_Sq(SqList &L,int i,ElementType e){
if(i<1 || i>L.length+1) {
return ERROR;
}
if(L.length >= L.listsize){
ElementType * newbase = (ElementType *) realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElementType));
if(!newbase) exit(OVERFLOW);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
ElementType *q = &(L.elem[i-1]);
for(ElementType *p = &(L.elem[L.length-1]);p>=q;--p){
*(p+1) = *p;
}
*q = e;
++L.length;
return OK;
}
从后面往前遍历,就行了。
2.3 线性表删除
从前往后删除
Status ListDelete_Sq(SqList &L,int i,ElementType &e){
if((i<1)|| (i>L.length)) return ERROR;
int* p = &(L.elem[i-1]);
e = *p;
int* q = L.elem + L.length - 1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
return OK;
}
2.5 线性表查找
直接找这个值。我们从头到尾遍历就行了。
Status compare(ElementType a,ElementType b){
return a==b?0:1;
}
int LocateElem_Sq(SqList L,ElementType e,Status (*compare)(ElementType,ElementType)){
int i = 1;
int* p = L.elem;
while(i<=L.length && !(*compare)(*p++,e)){
++i;
}
if(i<=L.length) return i;
else return 0;
}
2.6 自己设计函数 删除范围
这道题目我先用了普通的O(n^2)复杂度进行计算,然后我们用空间换时间的O(n)的复杂度进行替换,因此这两个算法都一一给出。感觉第二种好理解一些。
Status Delete_minToMax(SqList &L,ElementType min,ElementType max){
while(1){
int flag = true;
int i;
for(i =0;i<L.length;i++){
if(L.elem[i]>min && L.elem[i]<max){
flag = false;
break;
}
}
for(int j= i+1;j<L.length;j++){
L.elem[j-1] = L.elem[j];
}
if(flag) break;
else L.length--;
}
return TRUE;
}
Status Delete_minToMax2(SqList &L,ElementType min,ElementType max){
SqList L_cp;
InitList_Sq(L_cp);
for(int i=0;i<L.length;i++){
if(L.elem[i]>min && L.elem[i]<max) continue;
L_cp.elem[L_cp.length++] = L.elem[i];
}
L.length = 0;
for(int i=0;i<L_cp.length;i++){
L.elem[L.length++] = L_cp.elem[i];
}
return TRUE;
}
2.7 总结
题目整体来说也不难,主要是一些小细节需要单独处理,比如L.length什么时候啥时候删除减去。这些都是事先想好,这样做题才会快。
完整代码
#include<iostream>
#define ERROR -1
#define OVERFLOW -1
#define TRUE 1
#define OK 1
#define LISTINCREMENT 10
#define LIST_INIT_SIZE 100
typedef int Status;
typedef int ElementType;
using namespace std;
typedef struct{
ElementType *elem;
int listsize;
int length = 0;
}SqList;
//2.3
Status ListInsert_Sq(SqList &L,int i,ElementType e){
if(i<1 || i>L.length+1) {
return ERROR;
}
if(L.length >= L.listsize){
ElementType * newbase = (ElementType *) realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElementType));
if(!newbase) exit(OVERFLOW);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
ElementType *q = &(L.elem[i-1]);
for(ElementType *p = &(L.elem[L.length-1]);p>=q;--p){
*(p+1) = *p;
}
*q = e;
++L.length;
return OK;
}
Status ListDelete_Sq(SqList &L,int i,ElementType &e){
if((i<1)|| (i>L.length)) return ERROR;
int* p = &(L.elem[i-1]);
e = *p;
int* q = L.elem + L.length - 1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
return OK;
}
Status compare(ElementType a,ElementType b){
return a==b?0:1;
}
int LocateElem_Sq(SqList L,ElementType e,Status (*compare)(ElementType,ElementType)){
int i = 1;
int* p = L.elem;
while(i<=L.length && !(*compare)(*p++,e)){
++i;
}
if(i<=L.length) return i;
else return 0;
}
Status InitList_Sq(SqList &L){
L.elem = (ElementType *)malloc(LIST_INIT_SIZE*sizeof(ElementType));
if(!L.elem) exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
//并设计一个算法删除所有值大于min而且小于max的元素。
/*Status Delete_minToMax(SqList &L,ElementType min,ElementType max){
while(1){
int flag = true;
int i;
for(i =0;i<L.length;i++){
if(L.elem[i]>min && L.elem[i]<max){
flag = false;
break;
}
}
for(int j= i+1;j<L.length;j++){
L.elem[j-1] = L.elem[j];
}
if(flag) break;
else L.length--;
}
return TRUE;
}*/
Status Delete_minToMax2(SqList &L,ElementType min,ElementType max){
SqList L_cp;
InitList_Sq(L_cp);
for(int i=0;i<L.length;i++){
if(L.elem[i]>min && L.elem[i]<max) continue;
L_cp.elem[L_cp.length++] = L.elem[i];
}
L.length = 0;
for(int i=0;i<L_cp.length;i++){
L.elem[L.length++] = L_cp.elem[i];
}
return TRUE;
}
int main(){
//test1:
SqList L;
int flag = InitList_Sq(L);
flag = ListInsert_Sq(L,1,1);
flag = ListInsert_Sq(L,1,2);
flag = ListInsert_Sq(L,1,3);
flag = ListInsert_Sq(L,1,4);
flag = ListInsert_Sq(L,1,5);
flag = ListInsert_Sq(L,1,6);
cout << "test1:" << endl;
for(int i=0;i<L.length;i++){
cout << L.elem[i] << " ";
}
cout << endl;
//test2:
int x;
flag = ListDelete_Sq(L,2,x);
cout << "test2:";
cout << endl << "Delete Element:" << x << endl;
for(int i=0;i<L.length;i++){
cout << L.elem[i] << " ";
}
//test3: find == 4
cout << endl << "test3: find4:" << endl;
int pos;
pos = LocateElem_Sq(L,4,compare);
cout << L.elem[pos] << endl;
//test4:delete 2 - 5
cout << "test4:" << endl <<"(2,5)Delete before:" << endl;
for(int i=0;i<L.length;i++){
cout << L.elem[i] << " ";
}
cout << endl << "after Deleted :" << endl;
/*flag = Delete_minToMax(L,2,5);*/
flag = Delete_minToMax2(L,2,5);
for(int i=0;i<L.length;i++){
cout << L.elem[i] << " ";
}
return 0;
}