前言
欢迎阅读文章!这里是自己在复习王道数据结构过程中把书上代码编译实现而写的笔记,仅供参考,有误还请指出,谢谢!
一、顺序表
准备
#include<stdio.h> //printf 输出函数和 scanf 输入函数所在头文件
#include<stdlib.h> //exit 函数、malloc 函数、realloc 函数所在的头文件
//用#define 宏来定义符号常量和函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INSEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 5 //顺序表存储空间的初始分配量
#define LISTINCREMENT 10 //顺序表存储空间的分配增量
#define InitSize 100
//用 typedef 给类型起别名
typedef int Status; //Status 是函数的类型,其值是函数结果状态代码
typedef int ElemType; //本例中顺序表中存储 int 型数据
顺序表的动态分配
//———————线性表的动态分配顺序存储结构———————
typedef struct{
ElemType *data;
int length;
int MaxSize;
}SqList;
二、顺序表的基本操作
补充:构造一个空的线性表
代码如下(示例):
//补充:构造一个空的线性表
Status InitList_Sq(SqList &L){
L.data=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.data) exit(OVERFLOW);
L.length=0;
L.MaxSize=LIST_INIT_SIZE;
return OK;
}
1.插入操作:在顺序线性表 L 中第 i 个位置之前插入新的元素 e
时间复杂度O(n)
代码如下(示例):
//(1)插入操作:在顺序线性表 L 中第 i 个位置之前插入新的元素 e
bool ListInsert(SqList &L,int i,ElemType e){
if(i<1||i>L.length+1) return FALSE;//判断插入位置 i 是否合法
if(L.length>=L.MaxSize) return FALSE;
for(int j=L.length;j>=i;j++)
L.data[j]=L.data[j-1];
L.data[i-1]=e;
L.length++;
return TRUE;
}
2.删除操作:删除顺序表L中 i 个位置的元素,并用变量e返回
时间复杂度O(n)
//(2)删除操作:删除顺序表L中 i 个位置的元素,并用变量e返回
bool ListDelete(SqList &L,int i,ElemType e){
if(i<1 || i>L.length) return FALSE;
e=L.data[i-1];
for(int j=i;j<L.length;j++){
L.data[i-1]=L.data[j];
}
L.length--;
return TRUE;
}
3.按值查找:在顺序表L中查找第一个元素值为e的元素并返回其位序
时间复杂度O(1)
//(3)按值查找:在顺序表L中查找第一个元素值为e的元素并返回其位序
int LocateElem(SqList L,ElemType e){
int i;
for(i=0;i<L.length;i++){
if(L.data[i]==e){
return i+1;//
}
}
return 0;//退出循环,说明没有找到元素
}
补充:顺序表显示函数,将顺序表 L 表中每个元素逐个显示出来
//补充:顺序表显示函数,将顺序表 L 表中每个元素逐个显示出来
void ListDisp_Sq(SqList L)
{ int i;
printf("\n 当前线性表中的数据是:\n");
for(i=0;i<L.length;i++)
{
printf("线性表的第%d 个数是%d\n",i,L.data[i]);
}
printf("线性表数据显示完毕!\n \n");
}
总代码
#include<stdio.h> //printf 输出函数和 scanf 输入函数所在头文件
#include<stdlib.h> //exit 函数、malloc 函数、realloc 函数所在的头文件
//用#define 宏来定义符号常量和函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INSEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 5 //顺序表存储空间的初始分配量
#define LISTINCREMENT 10 //顺序表存储空间的分配增量
#define InitSize 100
//用 typedef 给类型起别名
typedef int Status; //Status 是函数的类型,其值是函数结果状态代码
typedef int ElemType; //本例中顺序表中存储 int 型数据
//———————线性表的动态分配顺序存储结构———————
typedef struct{
ElemType *data;
int length;
int MaxSize;
}SqList;
//补充:构造一个空的线性表
Status InitList_Sq(SqList &L){
L.data=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.data) exit(OVERFLOW);
L.length=0;
L.MaxSize=LIST_INIT_SIZE;
return OK;
}
//(1)插入操作:在顺序线性表 L 中第 i 个位置之前插入新的元素 e
bool ListInsert(SqList &L,int i,ElemType e){
if(i<1||i>L.length+1) return FALSE;//判断插入位置 i 是否合法
if(L.length>=L.MaxSize) return FALSE;
for(int j=L.length;j>=i;j++)
L.data[j]=L.data[j-1];
L.data[i-1]=e;
L.length++;
return TRUE;
}
//(2)删除操作:删除顺序表L中 i 个位置的元素,并用变量e返回
bool ListDelete(SqList &L,int i,ElemType e){
if(i<1 || i>L.length) return FALSE;
e=L.data[i-1];
for(int j=i;j<L.length;j++){
L.data[i-1]=L.data[j];
}
L.length--;
return TRUE;
}
//(3)按值查找:在顺序表L中查找第一个元素值为e的元素并返回其位序
int LocateElem(SqList L,ElemType e){
int i;
for(i=0;i<L.length;i++){
if(L.data[i]==e){
return i+1;//
}
}
return 0;//退出循环,说明没有找到元素
}
//补充:顺序表显示函数,将顺序表 L 表中每个元素逐个显示出来
void ListDisp_Sq(SqList L)
{ int i;
printf("\n 当前线性表中的数据是:\n");
for(i=0;i<L.length;i++)
{
printf("线性表的第%d 个数是%d\n",i,L.data[i]);
}
printf("线性表数据显示完毕!\n \n");
}
//主函数
int main()
{
SqList L; //定义顺序表 L
InitList_Sq(L);//调用函数,构造空表
//调用函数,向 L 表中指定位置插入数据
ListInsert(L,1,11);//调用函数,向 L 表中指定位置插入数据
ListInsert(L,2,22);
ListInsert(L,3,33);
ListInsert(L,4,38);
printf("下面是元素插入指定位置后的线性表数据:\n") ;
ListDisp_Sq(L);//调用函数,显示线性表
printf("下面是删除指定位置元素后的线性表数据:\n") ;
ListDelete(L,4,38);//调用函数,向 L 表中删除指定位置数据
ListDisp_Sq(L);//调用函数,显示删除数据后的线性表
printf("下面是查找表中第一个元素值为e的位序:\n") ;
int pos = LocateElem(L,22);
if(pos != 0) {
printf("%d\n", pos);
} else {
printf("元素值为22的元素不存在\n");
}
}
运行结果
总结
顺序表