1.顺序表存储:
顺序在内存中是顺序存储的,并且他们之间的地址相邻,所有的数据都是紧挨着的,所以对于顺序表来说如果进行删除或者是添加就很麻烦,需要一个个的往后或者往前移动,时间复杂度太高。
存储结构:
typedef struct
{
int *elem; //数据域
int length; //顺序表的长度
int listsize; //一次性申请的长度,可以用来和length比较来判断顺序表是否已经满了。
}sqlist;
2.顺序表的初始化
int list(sqlist *L)
{
L->elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
if (!L->elem)
{
printf("OVERFLOW");
return error;
}
L->length = 0;
L->listsize = LIST_INIT_SIZE; //开辟空间
return OK;
}
3.顺序表的查找
int locat(sqlist L, int e)
{
int * p;
int i = 1;
p = L.elem; //p指针指向了L.elem的第一个元素
while (i <= L.length && (*p++) != e) //当i大于了顺序表的长度或者说没有找到了元素e就会跳出循环
i++;
if (i <= L.length) //如果说查找的长度是小于顺序表的长度说明,e元素存在且已经被查找到了,这个时候返回i就是e元素的位置
return i;
else
return 0;
}//查找元素位于顺序表中的位置
4.顺序表的插入
void listinset(sqlist * L, int i, int e)
{
if (L->length == L->listsize) //先进行判断当前的顺序表的长度是否和原先的长度申请的长度相同
{
L->listsize = L->listsize + LISTCREMENT;
}
for (int j = L->length - 1; j >= i - 1; j--) //找到后就把依次把元素往后移,最后把元素e插入进去
L->elem[j + 1] = L->elem[j];
L->elem[i - 1] = e;
L->length++;
}//插入元素
5.顺序表的删除
void listdelete(sqlist * L, int i)
{
if (i > L->length) //如果说i>L->length说明i已经大于了顺序表的界限了
{
printf("\n删除失败,超出了顺序表的界限.");
return 0;
}
for (int j = i - 1; j < L->length; j++) //首先找到删除元素的位置,然后将后面的元素依次往前赋值,依次覆盖原来的值
L->elem[j] = L->elem[j + 1];
L->length--;
}//删除元素
6.顺序表建立、查找、删除、插入整体的代码
#include <iostream>
#include <stdio.h>
using namespace std;
#define LIST_INIT_SIZE 5
#define LISTCREMENT 20
#define OK 1
#define error 0;
#pragma warning(disable:4996)
typedef struct
{
int *elem;
int length;
int listsize;
}sqlist;
int list(sqlist *L)
{
L->elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
if (!L->elem)
{
printf("OVERFLOW");
return error;
}
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return OK;
}
int locat(sqlist L, int e)
{
int * p;
int i = 1;
p = L.elem;
while (i <= L.length && (*p++) != e)
i++;
if (i <= L.length)
return i;
else
return 0;
}//查找元素位于顺序表中的位置
void listinset(sqlist * L, int i, int e)
{
if (L->length == L->listsize)
{
L->listsize = L->listsize + LISTCREMENT;
}
for (int j = L->length - 1; j >= i - 1; j--)
L->elem[j + 1] = L->elem[j];
L->elem[i - 1] = e;
L->length++;
}//插入元素
void listdelete(sqlist * L, int i)
{
if (i > L->length)
{
printf("\n删除失败,超出了顺序表的界限.");
return 0;
}
for (int j = i - 1; j < L->length; j++)
L->elem[j] = L->elem[j + 1];
L->length--;
}//删除元素
int main()
{
sqlist L;
int n, m, i, e;
list(&L);
printf("\n请输入要添加的个数:");
scanf("%d", &m);
printf("\n请依次输入要添加的元素:");
for (i = 0; i < m; i++)
{
scanf("%d", &n);
L.elem[i] = n;
L.length++;
}
printf("\n请输入查找的数据:");
scanf("%d", &n);
n = locat(L, n);
printf("%d\n", n);
printf("\n请输入要插入的位置和元素:");
scanf("%d %d", &i, &e);
listinset(&L, i, e);
for (i = 0; i < L.length; i++)
printf("%d ", L.elem[i]);
printf("\n请输入要删除的位置:");
scanf("%d", &i);
listdelete(&L, i);
for (i = 0; i < L.length; i++)
printf("%d ", L.elem[i]);
return 0;
}