欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

顺序表的实现

程序员文章站 2024-02-29 08:24:52
...

顺序表,顾名思义,就是根据顺序存储的表,它是数据结构中最简单的结构,实现它也是很简单的,我们常常会把它和数组的存储进行类比,因为他们确实有很多相似的地方。顺序表作为线性表中的一种,它的操作特点是可以在任意位置插入和删除一个数据元素。实现顺序存储结构的方法是使用数组数组把线性表的数据元素存储在一块连续地址空间的内存单元中,这样,线性表中逻辑上相邻的数据元素在物理存储地址上也相邻。

要想实现顺序表,必须知道下面这几个基本的操作。首先,我们需要定义一个结构体,然后再对顺序表进行初始化,还需要求当前元素的个数,这些都是为了构建顺序表而准备。完成这些准备之后,我们就可以开始编写插入函数和删除函数的,还需要一个取数据元素的函数,由于顺序表是有限长度的表,没有用malloc动态开辟空间,因此也就不需要写一个destroy函数去释放空间内存了。

顺序表使用过程中,同样也需要注意一下问题

1.由于定义了顺序表的最大长度,因此我们需要注意下标越界的问题,这里暂且叫做下标

2.顺序表的插入和删除位置是相对来说的,如果你想要同时插入或者删除多个数据,那么你需要知道,当你插入一个数据之后,顺序表中数据的相对位置都发生了变化,千万不要让数据删除或者插入在并不存在的位置,这样程序会崩

记得这两点,我觉得建立并且合法使用顺序表就没有任何问题了

接下来,我把每个函数的代码附上

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int DataType;

typedef struct
{
	DataType  list[MAXSIZE];
	int size;
}SeqList;

void ListIntiate(SeqList *L)
{
	L->size=0;
}

int ListLength(SeqList L)
{
	return L.size;
}
int ListInsert(SeqList *L,int i,DataType x)
{
	int j;
	if(L->size>=MAXSIZE)
	{
		printf("顺序表已满无法插入!\n");
		return 0;
	}
	else if(i<0||i>L->size)
	{
		printf("参数i不合法!\n");
		return 0;
	}
	else
	{
		for(j=L->size;j>i;j--)
			L->list[j]=L->list[j-1];
		L->list[i]=x;
		L->size++;
		return 1;
	}
}
int ListDelete(SeqList *L,int i,DataType *x)
{
	int j;
	if(L->size<=0)
	{
		printf("顺序表已空无数据元素可删!\n");
        return 0;
	}
	else if(i<1||i>L->size-1)
	{
		printf("参数i不合法!");
		return 0;
	}
	else
	{
		*x=L->list[i];
		for(j=i+1;j<=L->size-1;j++)
			L->list[j-1]=L->list[j];
		L->size--;
		return 1;
	}
}
int ListGet(SeqList L,int i,DataType *x)
{
	if(i<0||i>L.size-1)
	{
		printf("参数i不合法!\n");
		return 0;
	}
	else
		*x=L.list[i];
	return 1;
}

void main()
{
	SeqList myList;
	int i,x;

	ListIntiate(&myList);
	for(i=0;i<10;i++)
		ListInsert(&myList,i,i+1);
	ListDelete(&myList,4,&x);
	for(i=0;i<ListLength(myList);i++)
	{
		ListGet(myList,i,&x);
			printf("%d   ",x);
	}
	system("pause");
}