C++ 数据结构1—线性表—顺序表
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 10
//定义线性表结构
//1.静态存储
typedef struct{
int data[Maxsize]; //用静态的“数组”存放数据 ElemType->int
int length; //表示顺序表当前的长度
}SqList;
void InitList(SqList &L){
for(int i = 0 ; i < Maxsize ; i++)
L.data[i] = 0; //将所有数据全部设置成0
L.length = 0; //顺序表当前的长度0
}
//2.动态分配---使用指针//
/*
#define InitSize 10 //顺序表的初始长度
typedef struct{
int *data; //指示动态分配数组的指针ElemType
int MaxSize; //顺序表的最大容量
int length; //顺序表当前长度
}SeqList;
//初始化
void InitList(SeqList &L){
L.data = (int*)malloc(sizeof(int)*InitSize);
L.length = 0;
L.MaxSize = InitSize;
}
//增加动态数组的长度
void IncreaseSize(SeqList &L, int len){
int *p=L.data;
L.data=(int *)malloc(sizeof(int)*(InitSize+len));
for(int i = 0; i<L.length; i++){
L.data[i] = p[i];
}
L.MaxSize += len;
free(p); //将p指向的原来的10个单位的内存释放
}
*/
//insert---插入元素
//在第i个位置插入新的元素
int ListInsert(SqList &L, int i, int e){ //将第i个元素及以后的元素后移
//i=[1,L.length+1]切L.length<MaxSize
if(i<1||i>L.length+1){
printf("insert fail==i is X\n");
return 0;
}
if(L.length>=Maxsize){
printf("insert fail==over\n");
return 0;
}
for(int j = L.length; j>=i; j--)
L.data[j] = L.data[j-1]; //元素后移
L.data[i-1] = e; //第i个位置的下标是i-1
L.length++;
printf("insert success!\n");
return 1;
}//时间复杂度
//最好情况:插入到表尾,不需要移动数据,循环次数0次,最好时间复杂度O(1);
//最坏情况:插入到表头,需要移动数据n个,循环次数n次,最好时间复杂度O(n);
//平均情况:不想说,要循环(n+(n-1)+...+0)/(n+1)=...
//delete----删除元素
bool ListDelete(SqList &L, int i, int &e){
if(i<1||i>L.length) //这个地方不是>=
return false;
e = L.data[i-1];
for(int j=i; j<L.length; j++)
L.data[j-1] = L.data[j];
L.length--;
return true;
}
//最好情况:O(1),最坏情况O(n),平均情况O(n)
//find---查找
//1.按位查找
bool ListFind(SqList L,int i ,int &e){ //查找第i个元素的值
if(i<1||i>L.length){
return false;
}
e = L.data[i-1];
return true;
}//时间复杂度:O(1)
//按值查找
int ListFind_E(SqList L,int e){
for(int i = 0;i<L.length;i++){
if(L.data[i]==e)
return i+1;
}
return 0;
}//时间复杂度:最好:O(1),最坏O(n),平均:...
int main ()
{
SqList L; //声明一个线性表
InitList(L); //初始化线性表
ListInsert(L,1,1);
ListInsert(L,2,2);
ListInsert(L,3,3);
ListInsert(L,4,4);
ListInsert(L,5,5);
int e = 0; //用e将数据带回来
bool isDelete = ListDelete(L,3,e);
if(isDelete) printf("数据已删除%d\n", e);
else printf("删除失败\n");
if(ListFind(L,3,e)) printf("第3个数是%d\n", e);
else printf("查找失败\n");
printf("4在第%d位\n",ListFind_E(L,4));
//SeqList L;
//InitList(L);
//IncreaseSize(L,5);
return 0;
}