线性表:顺序表

1.顺序表存储:

顺序在内存中是顺序存储的,并且他们之间的地址相邻,所有的数据都是紧挨着的,所以对于顺序表来说如果进行删除或者是添加就很麻烦,需要一个个的往后或者往前移动,时间复杂度太高。

存储结构:

typedef struct
{
    int *elem;  //数据域
    int length; //顺序表的长度
    int listsize; //一次性申请的长度,可以用来和length比较来判断顺序表是否已经满了。
}sqlist;

线性表:顺序表_第1张图片

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 
#include 
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;
}

 

你可能感兴趣的:(线性表:顺序表)