1.线性表的定义: 0个或多个数据元素的有限序列。 元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。
2.线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
线性包的顺序存储代码:
1.线性表的基本定义:
#define MAXSIZE 20
typedef in ElemType; // ElemType 类型根据实际情况而定,这里假设为int*
typedef struct
{
ElemType data[MAXSIZE]; //数据存储元素,最大为MAXSIZE
int length; // 线性表的当前长度
}SqList
线性表长度和数组长度的区别:
2.创建线性表和打印输出线性表:
//创建一个长度为n的线性顺序表
void createSqlist(SeqList &L,int n)
{
print("请输入%d个数:\n",n);
for(int i=0;i<n;i++)
{
scanf("%d",&L.data[i]);
}
L.len = n;
}
//打印输出线性表
void printSqList(SqList L)
{
printf("打印线性表:");
for(int i = 0; i<L.len; i++)
{
printf("%d",L.data[i]);
}
printf("\n");
}
void main()
{
//初始化一个空线性表
SqList L;
L.len=0;
createSqList(L,5);
printSqList(L);
}
插入元素:(注意一步容错)
void insertSqList(SqList &L, int i, ElemType e) {
if (i<1)
{
printf("插入位置参数不合法");
}
else if (L.len >= MAXSIZE)
{
printf("表已满,无法差插入");
}
else if (i > L.len)
{
//容错插入位置比线性表长
i = L.len;
L.data[i] = e;
L.len++;
}
else
{
int j = L.len - 1;
for (j; j >= i - 1; j--) {
L.data[j + 1] = L.data[j];//从后往前移动元素
}
L.data[i-1] = e;
L.len++;
}
}
删除元素:
//删除元素 不传删除元素
void delSqList(SqList&L, int i)
{
if (i > L.len || i < 1)
{
printf("删除位置不合法");
}
int j = i - 1;//删除元素的下标
ElemType e;
e = L.data[j];
printf("删除的第%d位置的元素数据是%d\n", i, e);
for (j; j < L.len - 1; j++)
{
L.data[j] = L.data[j + 1];
}
L.len--;
}
//传删除的元素
//删除第i(1<=i<=L.len)个元素,并用e返回其值
//时间复杂度:O(n)
void delSqList(SqList &L, int i, ElemType &e){
if(i>L.len||i<1)
{
printf("删除位置参数不合法");
}
int j = i-1;//j是要被删除元素的下标
e = L.data[j];
printf("删除的第%d位置的数据是%d\n",i,e);
for(j;j<L.len-1;j++)
{
L.data[j] = L.data[j+1];
}
L.len--;
}
获取某位置的元素:
//获取某位置的元素
int getSqList(SqList &L, int i)
{
if (i < 0||i>=L.len)
{
printf("位置不合法");
return 0;
}
if (i < L.len)
{
return L.data[i - 1];
}
}
主函数:
void main()
{
//初始化一个空线性表
SqList L;
L.len = 0;
createSqlist(L, 5);
printSqList(L);
//完成插入功能
printf("您要插入的数据和位置(1~%d)(如:在第2个位置插入10则输入:10,2):", L.len);
int elem, pos;
scanf("%d,%d", &elem, &pos);
insertSqList(L, pos, elem);
printSqList(L);
//用插入来创建线性表
createUseInsertSqList(L, 6);
printSqList(L);
//完成删除功能
printf("您要删除的数据的位置(如:要删除第2个位置的数据则输入(1~%d):2):", L.len);
int pos;
ElemType elem;
scanf("%d", &pos);
delSqList(L, pos);
printSqList(L);
//获取元素
int a, i;
printf("输入获取位置\n");
scanf("%d", &i);
a = getSqList(L, i);
printf("第%d的元素是%d", i, a);
system("pause");
}
=========================================================================================
升级版:
按顺序合并两个线性表:(未去重) 后面的去重
//按顺序合并两个顺序表
void mergeSqList(SqList La, SqList Lb, SqList &Lc)
{
int i = 0, j = 0;
Lc.len = La.len + Lb.len;
int k = 0;
while (i < La.len && j < Lb.len)
{
if (La.data[i] <= Lb.data[j])
{
Lc.data[k] = La.data[i];
i++;
k++;
}
else
{
Lc.data[k] = Lb.data[j];
j++;
k++;
}
}
while (i<La.len) {
Lc.data[k] = La.data[i];
i++;
k++;
}
while (j<Lb.len) {
Lc.data[k] = Lb.data[j];
j++;
k++;
}
}
//合并两个线性没重复
int locateElem(SqList L, ElemType e)//比较e是否在L中
{
int i = 1;//位置
while (i <= L.len && L.data[i-1] != e)
{
i++;
}
if (i <= L.len)
return i;
else
return 0;
}
void unionSqList(SqList &La, SqList Lb)
{
for (int i = 0; i < Lb.len; i++)
{
ElemType e = Lb.data[i];
if (!locateElem(La, e))//e不在La中
{
insertSqList(La, La.len+1, e);
}
}
}
参考资料: