*不是纯c语言有一部分c++的内容
*以图书管理系统为例子带你理解
线性表的基本概念:
具有相同数据类型的 n (n ≥ 0 n\ge0n≥0)个数据元素的有限序列在内存空间中各数据的存储位置是一个连续的存在。
线性表的特点
1存在唯一一个被称作第一个的数据元素
2存在唯一一个被称作最后一个的数据元素
3除第一个元素以外每个元素都有唯一的前驱
4除最后一个元素以外每个元素都有唯一的后继
3线性表的顺序表示
LOC(ai)=LOC(a1)+(i-)*l
看着挺复杂其实可以这样理解
数组是从第一个元素a[0]起的而我们把第一个元素称作1
即a[i]=i+1
4规范化
#define error -1 #difine ok 1
这样规范化书写可以让我们的操作是否成功可视化
5顺序表的存储结构
#define maxsize 100//顺序表的最大长度(这样写的好处是可以根据不同数据大小更改) typedef struct // { ElemType *date;//存储数据的地址 int length;//记录当前线性表的长度 }SqList;//自定义一种结构体类型,它的名字是SqList //ElemType是一种数据类型可以为int,char,struct等
举个例子如果写的是图书管理系统那么ElemType *date就指向book
typedef struct { char name[20]; float price; }library; library book[maxsize];
6顺序表的初始化
status initlist (SqList &l) { l.date=(ElemType *)malloc(sizeof( ElemType)*maxsize)//为顺序表分配一个maxsize大小的空间 if(!l.date)//判断是否为空 return error; l.length=0;//将空表长度设置为0 return ok; }
指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量
同时还有另外一种写法c++
status initlist (SqList &l) { l.date=new ElemType[maxsize]; if(!l.date) return error; l.length=0; return ok; }
7顺序表的取值
status getelem(SqList l,int i,ElemType &e) { if(i<1 && i>maxsize)//判断的值是否合理 return error; e=l.elem[i-1];//elem[i-1]的位置存储第i个数据 return ok; }
ElemType &e中的e可以是一个结构体类型的数据
其实还可以通过循环的方式输入数据以上述图书管理系统为例
status getelem(SqList l,int i) { if(i<1 && i>maxsize)//判断的值是否合理 return error; int j; for(j=0;j<i;j++)//为线性表输入信息 { scanf("%c",&l.date[j].name); scanf("%f",&l.date[j].price); } return ok;//输入完毕返回 }
8线性表的查找
1按位查找
bool locateElem(SqList &l) { int i; printf("你要找第几个元素:"); scanf("%d", &i); if (i<1 || i>l.length + 1)//判断输入的i值是否合法 { printf("查找失败\n"); return error;//i值不合法 } printf("第%d个元素是%d\n", i, L.data[i - 1]); return ok; }
2按值查找
void LocateElem(SqList &L) { int e; int k = 1; printf("输入你要查找的元素:"); scanf("%d", &e); for (int i = 0; i < l.length; i++) if (l.data[i] == e) { printf("找到了,是第%d个元素\n", i + 1); k = 0; break; } if (k) printf("找不到元素%d\n", e); }
9顺序表的插入
bool ListInsret(SqList &L) { int i, e; printf("请输入要插入顺序表的元素和元素位置:"); scanf("%d %d", &e, &i); if (i<1 || i>L.length + 1)//判断元素下标是否越界 return error; if (l.length > l.maxsize)//判断顺序表存储空间是否满了 return error; for (int j = l.length; j >= i; j--) { l.data[j] = l.data[j-1];//从后往前逐个后移元素 } l.data[i-1] = e;//将新元素放入下标为i-1的位置 l.length++;//表长+1 printf("插入的元素是%d,插入的位置是%d\n", e, i); return ok; }
10顺序表的删除
bool ListDelete(SqList &L) { int i, e; printf("请输入要删除的元素位置:"); scanf("%d",&i); if (i<1 || i>l.length + 1)//判断元素下标是否越界 return false; if (!L.data)//判断是不是空表 { printf("空表\n"); return error; } e = l.data[i - 1]; for (int j = i; j <= L.length; j++) { L.data[j-1] = L.data[j]; } l.length--;//表长-1 printf("删除的元素是%d,这个元素的位置是%d\n", e, i); return ok; }
以上就是顺序表的增删改查本人初学如有错误请各位大佬指正