顺序表的算法
一:顺序表的定义
顺序表是再计算机中用一组连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理内存单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序结构的线性表通常称为顺序表。
二:顺序表的优点与缺陷
顺序表由于是将数据放到一块连续的内存空间,存取效率高,速度快,可以直接通过下标来访问和存储数据。
但存在的缺点是插入和删除比较慢,效率比较低。
三:定义顺序表存储类型
C语言:
#define MAXSIZE 100//线性表存储空间的初始分配量 typedef int ElemType; typedef struct{ ElemType data[MAXSIZE]; int length; }SqList;//定义一个结构体数据类型
C++:
typedef int ElemType; typedef struct { ElemType* data; int length; }Sqlist;
四:C语言的内存动态分配
SqList L;
L.data=(ElenType*)malloc(sizeof(ElemType)*MAXSIZE);//对申请的空间进行内存分配
注:malloc(m)函数:开辟m字节长度的地址空间,并返回这段空间的首地址。
sizeof(x)关键字:计算变量x的长度
free(p)函数:释放指针p所指的变量的存储空间,即彻底删除一个变量
需加载 #include<stdlib.h>头文件
五:c++的内存动态分配
new 类型名T(初置列表)
申请用于存放T类型对象的内存空间,并以初值列表赋值
分配成功:T类型的指针,指向新分配的内存
失败:0(NULL)
例:int *data=new int(10);
delete 指针p
释放指针p指向的内存
六:基本算法
(1):线性表的初始化
int InilList(SqList &L){ L.data = new ElemType[MAXSIZE]; if (!L.data) exit(0); L.length = 0;//初始化一个空表 return OK; }
(2): 清空线性表
void ClearList(Sqlist& L) { L.length = 0;//清空列表 }
(3):获得表长
int Getlength(Sqlist L) { return(L.length);//获得表长,并返回大小 }
(4):判断表是否为空表
int Empty(Sqlist L) { if (L.length == 0) return 1; else return 0;//判断线性表是否为空 }
(5):查找元素
int Search(Sqlist L, int i, ElemType& e) { if (i<1 || i>L.length) return ERROR; e = L.data[i - 1];//返回要查找的数 return OK; }
(6):元素定位
int Locatedata(Sqlist L, ElemType e) { int i; for (i = 0; i < L.length; i++) if (L.data[i] == e) return i + 1;//找到匹配的元素,返回元素序号 return 0; }
(7):插入元素
int ListInsert(Sqlist& L, int i, ElemType e) { if (L.length<1 || L.length>L.length + 1) return ERROR; if (L.length == MAXSIZE) return ERROR; for (int j = L.length; j >= i - 1; --j) { L.data[j + 1] = L.data[j];//把i-1本身和它后面的元素依次往后挪 } L.data[i - 1] = e;//挪完后插入元素 ++L.length;//然后表长加1 }
(8):删除元素
int Deletedata(Sqlist& L, int i) { if (i<1 || i>L.length) return ERROR; for (int j = i; j < L.length; j++) L.data[i - 1] = L.data[i];//通过值 覆盖的方法进行元素删除 --L.length;//表长减一 return OK; }
(9):打印线性表元素
void PrintList(Sqlist L) { printf("当前顺序表所有元素:"); for (int i = 0; i < L.length; i++) { cout << L.data[i] << endl; } }
七:源码
#include<iostream> using namespace std; #define ERROR 0 #define OK 1 #define MAXSIZE 100 typedef int Status; typedef int ElemType; typedef struct { ElemType* data; int length; }Sqlist; Status InitList(Sqlist& L) { L.data = new ElemType[MAXSIZE]; if (!L.data) exit(0); L.length = 0;//初始化一个空表 return OK; } void ClearList(Sqlist& L) { L.length = 0;//清空列表 } int Getlength(Sqlist L) { return(L.length);//获得表长,并返回大小 } int isEmpty(Sqlist L) { if (L.length == 0) return 1; else return 0;//判断线性表是否为空 } int Getdata(Sqlist L, int i, ElemType& e) { if (i<1 || i>L.length) return ERROR; e = L.data[i - 1];//返回要查找的数 return OK; } int Locatedata(Sqlist L, ElemType e) { int i; for (i = 0; i < L.length; i++) if (L.data[i] == e) return i + 1;//找到匹配的元素,返回元素序号 return 0; } int ListInsert(Sqlist& L, int i, ElemType e) { if (L.length<1 || L.length>L.length + 1) return ERROR; if (L.length == MAXSIZE) return ERROR; for (int j = L.length; j >= i - 1; --j) { L.data[j + 1] = L.data[j];//把i-1本身和它后面的元素依次往后挪 } L.data[i - 1] = e;//挪完后插入元素 ++L.length;//然后表长加1 } int Deletedata(Sqlist& L, int i) { if (i<1 || i>L.length) return ERROR; for (int j = i; j < L.length; j++) L.data[i - 1] = L.data[i];//通过值覆盖的方法进行元素删除 --L.length;//表长减一 return OK; } void PrintList(Sqlist L) { printf("当前顺序表所有元素:"); for (int i = 0; i < L.length; i++) { cout << L.data[i] << endl; } } void menu() { cout << "********1.创建 2.插入*****" << endl; cout << "********3.删除 4.表长******"<< endl; cout << "********5.查找 6.清空******"<< endl; cout << "********7.判空 8.输出******"<< endl; cout << "********9.退出 10.退出*****"<< endl; } int main() { Sqlist L; int choice, i; while (1) { int t, x, tt; ElemType sertnum1; int sertnum2, ii; ElemType ss; menu(); cout << "请输入菜单号:\n"; cin >> choice; if (choice == 11) break; switch (choice) { case 1: t = InitList(L); if (t) { cout << "初始化成功,请输入需要赋值的个数:\n"; cin >> x; cout << "请输入" << x << "个数字:\n"; for (i = 1; i <= x; i++) { cin >> tt; ListInsert(L, i, tt); } } else cout << "表已存在" << endl; break; case 2: cout << "请输入要插入的元素以及其位置:\n"; cin >> sertnum1 >> sertnum2; t = ListInsert(L, sertnum2, sertnum1); if (!t) cout << "插入失败" << endl; break; case 3: cout << "请输入需要删除元素的位置:\n"; cin >> ii; t = Deletedata(L, ii); if (!t) cout << "删除失败" << endl; break; case 4: t = Getlength(L); cout << "表长为:" << t << endl; break; case 5: cout << "请输入需要查询的元素:\n"; cin >> ss; t = Locatedata(L, ss); if (t) cout << t; else cout << "查无此元素" << endl; break; case 6: ClearList(L); cout << "表已清空" << endl; break; case 7: t = isEmpty(L); if (t) cout << "表为空" << endl; else cout << "表非空" << endl; break; case 8: PrintList(L); break; case 9: exit(0); default: cout << "数字非法,请重新输入" << endl; } } return 0; }