线性表的顺序存储结构常见操作

//main.cpp

#include"seqlist.h"
int main()
{

	seqlist* L = NULL;

	int i = 0;

	int *p = NULL;

	L = creat_seqlist();

	for (i = 0; i < 10; i++)
	{

		insert_seqlist(L, i, i*2);

	}

	show_seqlist(L);

	print();

	p=search_data_address(L,0);

	printf("%#x\n",p);

	printf("%#x\n",p+1);

	printf("%#x\n",p+2);

	system("pause");

	return 0;
}

//seqlist.cpp

#include"seqlist.h"


seqlist* creat_seqlist(void)//创建一个线性表,函数类型为结构体指针,返回一个结构体的首地址
{

	seqlist* L = NULL;//初始化链表指针,此时这个指针还没有指向具体的内存空间

	L =(seqlist*)malloc(sizeof(seqlist));//创建一个线性表,此时L所指向的地址的大小为sizeof(seqlist),即404个字节

	if (L == NULL)//判断是否创建成功
	{

		printf("seqlist init failed\n");

		return NULL;

	}
    	
	L->last = -1;//记录链表中元素个数

    return L;//返回创建链表的首地址
}


int is_seqlist_empty(seqlist* L)//判断链表是否为空
{
	if (L == NULL)
	{
		printf("seqlist is empty\n");

		return -1;

	}

	return (L->last == -1);

}

int is_seqlist_full(seqlist* L)//判断链表是否溢出
{

	if (L == NULL)
	{

		printf("seqlist is full\n");
     
		return -1;
	}

	return ((L->last) == (MAX - 1));

}

int insert_seqlist(seqlist* L,int pos,int value)//链表中插入一个元素
{

	if (is_seqlist_full(L) || pos<0 || pos>(L->last + 1))//判断插入的位置是否合理
	{

		printf("insert is failed\n");


		return -1;

	}

	L->data[pos] = value;//数据元素赋值

	L->last++;//记录元素个数

	return 0;

}

int show_seqlist(seqlist* L)//遍历链表
{

	int i = 0;

	 if(L==NULL)
	 {
		 printf("seqlist is NULL");

		 return -1;
	 }

	 for (i = 0; i <= L->last; i++)
	 {

		 printf("L->data[%d]=%d\n", i, L->data[i]);

	 }
	return 1;
}

int del_seqlist(seqlist* L,int pos)//删除链表中的元素
{

	int i = 0;

	if (pos<0||pos>L->last)//判断是否在有效范围内删除元素
	{

		printf("seqlist not is del");

		return -1;

	}

	for (i = pos; i < L->last; i++)
	{
 
		L->data[i] = L->data[i + 1];//后面的元素依次往前覆盖


	}
	
	L->last--;//元素个数减一

	return 1;

}

int clear_seqlist(seqlist* L)//释放链表
{

	if (L == NULL)
	{

		printf("seqlist is NULL");

		return -1;

	}

	free(L);//不像单链表要逐个节点释放,一次性释放在创建线性表时申请的内存空间即可

	return 1;

}

int get_seqlist_length(seqlist* L)//获取链表中元素个数
{

	if (L == NULL)
	{

		printf("seqlist is NULL: ");

		return -1;

	}

	return L->last + 1;//返回元素个数

}


int change_seqlist_value(seqlist* L,int pos,int value)//改变链表元素的值
{

	if (L == NULL || pos<0 || pos>L->last + 1)
	{

		printf("seqlist is NULL");

		return -1;
	}

	L->data[pos] = value;

	return 1;

}

int search_seqlist(seqlist* L,int value)//寻找链表中是否存在值为value的元素,找到则并返回值所在的位置
{

	int i = 0;

	if (L == NULL)
	{

		printf("seqlist is NULL");

		return -1;


	}

	for (i = 0; i <= L->last; i++)
	{

		if (L->data[i] == value)

			return i;

	}

	return 0;

}

int* search_data_address(seqlist* L, int pos)//返回链表中特定元素所在地址
{

	int* i = NULL;

	if (L == NULL)
	{

		printf("seqlist is NULL");

		return NULL;


	}

	i=&L->data[pos];

	return i;

}

void print(void)
{

	printf("\n");

}

//seqlist.h

#ifndef   _seqlist_h
#define   _seqlist_h

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<malloc.h>

#define MAX  100
typedef int datatype;

typedef struct list
{

	datatype data[MAX];

	datatype last;

}seqlist;


extern seqlist* creat_seqlist(void);
extern int is_seqlist_empty(seqlist* L);
extern int* search_data_address(seqlist* L, int pos);
extern int search_seqlist(seqlist* L, int value);
extern int change_seqlist_value(seqlist* L, int pos, int value);
extern int get_seqlist_length(seqlist* L);
extern int clear_seqlist(seqlist* L);
extern int del_seqlist(seqlist* L, int pos);
extern int show_seqlist(seqlist* L);
extern int insert_seqlist(seqlist* L, int pos, int value);
extern int is_seqlist_full(seqlist* L);
extern int is_seqlist_empty(seqlist* L);


extern void print(void);
#endif // _seqlist_h


注:线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

插入元素的思路:
(1)判断插入位置是否合理,即先要判断表是否为满和插入的位置是否在表的范围内。如果不合理则抛出异常。
(2)从最后一个元素开始向前遍历到插入元素的位置,分别将它们往后移动一个位置。
(3)移动后表将空出一个位置,然后将要插入的元素填入该位置。
(4)表的长度加一

if(l->length==max||i<1||i>l->length+1)
{
   return 0;
}

if(i<=l->length)
{
    for(k=l->length-1;k>=i-1;k--)
    {
       l->data[k+1]=l->data[k];
    }
}
l->data[i-1]=e;
l->length++;

删除元素的思路:
(1)判断删除位置是否合理。如果不合理则抛出异常。
(2)取出删除元素
(3)从删除元素位置开始遍历到最后一个元素位置,分别将它们都往前移动一个位置
(4)表的长度减一

if(l->length==0||i<1||i>l->length)
{
   return 0;
}
k=l->data[i-1];
if(i<l->length)
{
    for(k=i;k<l->length;k++)
    {
       l->data[k-1]=l->data[k];
    }
}
l->length--;

//线性表存储示意图
在这里插入图片描述

//数组元素下标地址计算方法
在这里插入图片描述
线性表:sequencelist
前驱元素,后继元素
元素之间是一对一关系
定义:零个或多个有序数据的集合(0个为空表)

1.描述线性表的顺序存储结构的三大属性:存储空间的起始位置,线性表的最大容量,线性表当前长度。
2.线性表顺序存储结构的定义:线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素
3.线性表顺序存储结构的优点:

(1)无须为表示表中元素之间的逻辑关系而增加额外的存储空间
(2)可以快速地存取表中任意位置的元素

4:线性表顺序存储结构的缺点:
(1)插入和删除操作需要移动大量的元素
(2)当线性表长度变化较大时,难以确定存储空间的容量
(3)造成空间的“碎片”

顺序表的操作:operation

InitList(seqlist*)
insert_emelment(seqlist*,index,elem)
deletelement(seqlist*,index,elem)
getlength(seqlist
)
isempty(seqlist*)
isfull(seqlist*)
clearlist(seqlist*)
getelement(seqlist*,index,)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值