提示:C语言,数据结构
目录
- 掌握顺序表的结构特点。
- 主要掌握顺序表的插入和删除算法。
- 学会分析算法的时间复杂度。
二、实验内容
已知顺序表L,从第i个元素起(包括第i个 )连续删除k个元素。
A、在上边的程序(main函数的上边),增加编写一个函数,例如:
int ListDel_Sq(SqList *L,int i,int k){
/*顺序表L,从第i个元素起连续删除k个元素。
删除成功返回1,否则返回0,如果i或k不合理,那么一个元素也不删除。*/
……
}//本算法可参考教材算法2.5
B、扩充上边主函数(main) 对初始的顺序表L(含n个数)调用ListDel_Sq(&L,2,3)函数,表 示从L中第2个元素起连续删除3个数,并输出调用ListDel_Sq后的L中的各个元素的值。
提示:ListDel_Sq这个函数如果是高效的,那么它的时间复杂度应为O(n),如果时间复杂度为 O(n2),那么需要对算法进行改进。
三、源程序
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100//
#define LISTINCREMENT 10
typedef int Status;
typedef struct{
int *elem;
int length;
int listsize;
}SqList;//声明
Status InitList_Sq(SqList *L){
L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));//
if(!L->elem) exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}//建表 时间复杂度O(1)
void CreateList(SqList *L,int n)//创建顺序表,含有n个数据元素
{
int i;
if(n<0 || n>LIST_INIT_SIZE) return;
printf("请为顺序表输入%d个整数:\n",n);
for(i=0;i<n;i++)
scanf("%d",&L->elem[i]);
L->length=n;
}//输入
void PrintList(SqList L){//输出顺序表中的数据
int i;
printf("顺序表中的数据依次为:\n");
for(i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
printf("\n");
}//输出
Status ListDel_Sq(SqList *L,int i,int k){
int j;
if(i<1 || i>L->length) return ERROR;
for(j=i;j+k<=L->length;j++) L->elem[j-1]=L->elem[j-1+k];
L->length-=k;
return OK;
}//从第i个元素起删除k个元素
void main(){
SqList L;
InitList_Sq(&L);//初始化顺序表L
CreateList(&L,5);//检查输入是否有误
PrintList(L);
ListDel_Sq(&L,2,2);
PrintList(L);
free(L.elem);
}
四、运行示例
五、总结
- 在输入或者书写代码时切记切记切记大小写的区分,养成规范良好的习惯,上下文保持一致,多注意上文所定义的函数名。
- 边写边思考,快速思考,养成条件反射,对代码要有感觉。
- 新建文件时选择.cpp文件,.c文件局限大,有很多代码执行不起来。