/* *Copyright (c)2015, 烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:Apply.cpp *作 者:苏凯祺 *完成日期:2014年10月19号 *版 本 号:v1.0 *问题描述:删除元素在【x,y】之间所有的元素(x,y)只的是位置,要求算法的时间复杂度为O(n),空间复杂度为O(1)。 */ list.h #include<stdio.h> #define MaxSize 50 typedef int ElemType; typedef struct { ElemType data[MaxSize]; int length; }SqList; void ListDelete(SqList *&L,int x,int y); void DispList(SqList *L); bool ListEmpty(SqList *L);//判定是否为空表ListEmpty(L) void CreateList(SqList *&L, ElemType a[], int n);//用数组创建线性表 list.cpp #include"list.h" #include <stdio.h> #include <malloc.h> void InitList(SqList *&L) //引用型指针 { L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间 L->length=0; } void CreateList(SqList *&L, ElemType a[], int n) { int i; L=(SqList *)malloc(sizeof(SqList)); for (i=0; i<n; i++) L->data[i]=a[i]; L->length=n; } bool ListEmpty(SqList *L) { return(L->length==0); } void DestroyList(SqList *&L) { free(&L); } void DispList(SqList *L) { int i; if (ListEmpty(L)) return; for (i=0; i<L->length; i++) printf("%d ",L->data[i]); printf("\n"); } void ListDelete(SqList *&L,int x,int y) { int j; /* if(x>y) {j=x;x=y;y=j;} //对x,y大小顺序的改变 x=x-1;y=y-1; //逻辑顺序时使用 */ if(x<=0&&0<=y&&y<L->length-1) {for (j=0; j<L->length-y-1; j++) //将data[i..n-1]元素前移 L->data[j]=L->data[j+y+1]; L->length=L->length-y-1; } else if(0<x&&x<L->length&&y>=L->length-1) {L->length=x;} else if(x<=0&&y>=L->length-1) { L->length=0; } else if(0<x&&x<L->length&&0<y&&y<L->length-1) {for (j=x; j<L->length-1-y+x; j++) //将data[i..n-1]元素前移 L->data[j]=L->data[j+1-x+y]; L->length=L->length-y+x-1;} } main.cpp #include"list.h" int main() { int x,y; SqList *s; ElemType z[6]= {5,8,7,2,4,9}; CreateList(s, z, 6); scanf("%d%d",&x,&y); ListDelete(s,x,y); DispList(s); return 0; }
运行结果:
知识点总结:
线性表的基本处理以及对各个函数之间的应用。
学习心得:
这个本来是我领会错了题意的,看成了位置,写的有点复杂。有不少的bug,更多的应用了单步调试,对于单步调试也是越来越精了。可能是以前对于线性表有些不解,但是自己亲身去解决这个问题的时候,很多问题就那么莫名其妙的就别解开了。虽然自己写的有点慢,但是还是会加油的!!