【数据结构】顺序表

函数声明文件

#include
#include
#include

#define SIZE 10
#define ElemType int
#define FALSE 0
#define TRUE 1

typedef struct SqList
{
	int *elem;     //  指向存储数据元素的空间的指针
	int count;    //  当前已经存储数据的个数
	int size;  //  当前分配的存储空间的大小
}SqList, *Psqlist;

//初始化顺序表
void InitSqList(Psqlist list);

// 在顺序表的指定位置pos插入数据val
int InsertSqList(Psqlist list, int pos, ElemType val);

// 在顺序表的第一个位置插入数据
void InsertHead(Psqlist list, ElemType val);

// 在顺序表的最后一个位置插入数据
void InsertTail(Psqlist list, ElemType val);

// 删除指定位置的数据
int DeleteSqList(Psqlist list, int pos);

// 删除第一个数据元素
void DeleteHead(Psqlist list);

// 删除最后一个数据元素
void DeleteTail(Psqlist list);

//销毁链表
void DestroySqList(Psqlist list);

// 查找val所在的位置(最后一次出现的位置)
void FindVal(Psqlist list, ElemType val);

//输出数据
void ShowSqList(Psqlist list);

函数实现文件

#include"list.h"

//初始化顺序表
void InitSqList(Psqlist list)
{
	assert(list != NULL);
	list->elem = (ElemType *)malloc(sizeof(ElemType) * SIZE);
	list->count = 0;
	list->size = SIZE;
}

//顺序表扩容
static void Expand(Psqlist list)
{
	assert(list != NULL);
	list->size = 2 * SIZE;
	ElemType *new_elem = (ElemType *)malloc(sizeof(ElemType) * list->size);
	assert(new_elem != NULL);

	for(int i = 0; i < list->size; i++)
	{
		new_elem[i] = list->elem[i];
	}
	free(list->elem);
	list->elem = new_elem;

}
// 在顺序表的指定位置pos插入数据val
int InsertSqList(Psqlist list, int pos, ElemType val)
{
	assert(list != NULL);
	if(pos < 0 || pos > list->count)//顺序表的存储要连续
	{
		return FALSE;
	}
	if(list->count == list->size)
	{
		Expand(list);
	}
	int i = 0;
	for( i = list->count; i > pos; i--) 
	{
		list->elem[i] = list->elem[i - 1];
	}
	list->elem[i] = val;
	list->count++;
	return TRUE;
}

// 在顺序表的第一个位置插入数据
void InsertHead(Psqlist list, ElemType val)
{
	assert(list != NULL);
	InsertSqList(list, 0, val);
}

// 在顺序表的最后一个位置插入数据
void InsertTail(Psqlist list, ElemType val)
{
	assert(list != NULL);
	InsertSqList(list, list->count, val);
}

// 删除指定位置的数据
int DeleteSqList(Psqlist list, int pos)
{
	assert(list != NULL);
	if( pos < 0 || pos > list->count )
	{
		return FALSE;
	}
	int i = pos;
	for(; i < list->count; i++)
	{
		list->elem[i] = list->elem[i + 1];
	}
	list->count--;
	return TRUE;
}

// 删除第一个数据元素
void DeleteHead(Psqlist list)
{
	assert(list != NULL);
	DeleteSqList(list, 1);
}

// 删除最后一个数据元素
void DeleteTail(Psqlist list)
{
	assert(list != NULL);
	DeleteSqList(list, list->count);
}

//销毁链表
void DestroySqList(Psqlist list)
{
	assert(list != NULL);
	free(list->elem);
	list->elem = NULL;
	list->count = 0;
	list->size = 0;
}

// 查找val所在的位置(最后一次出现的位置)
void FindVal(Psqlist list, ElemType val)
{
	assert(list != NULL);
	int tmp = -1;
	for( int i = 0; i < list->count; i++)
	{
		if(list->elem[i] == val)
		{
			tmp = i;
		}
	}
	if( tmp == -1)
	{
		printf("val is inexistence!\n");
	}
	else
	{
		printf("the last seen is %d\n",tmp);
	}
}

//输出数据
void ShowSqList(Psqlist list)
{
	assert(list != NULL);
	printf("list =");
	for( int i = 0; i < list->count; i++)
	{
		printf("%3d",list->elem[i]);
	}
	printf("\n");
}

测试函数

#include"list.h"
int main()
{
	SqList list;
	InitSqList(&list);
	for( int i = 0; i < 15; i++)
	{
		InsertSqList(&list, i, i);
	}
	ShowSqList(&list);
	printf("************************************\n");
	DeleteSqList(&list, 1);
	ShowSqList(&list);
	DeleteSqList(&list, list.count);
	ShowSqList(&list);
	DeleteSqList(&list, 3);
	ShowSqList(&list);
	DeleteSqList(&list, 6);
	ShowSqList(&list);

	return 0;
}

 

你可能感兴趣的:(数据结构)