数据结构基础(顺序表)

顺序表完整代码

      • SeqList.h
      • SeqList.c
      • test.c

SeqList.h

#pragma once

#include 
#include 
#include 
#include 

//#define N 1000
//typedef int SLDataType;

 静态顺序表
//typedef struct SeqList {
//	SLDataType a[N];
//	int size;// 数组中存储数据的个数
//}SL;
//
 静态特点:如果满了就不能插入 缺点:多少大小合适?
 接口函数
//void SeqListInit(SL* ps);
//void SeqLIstPushBack(SL* ps, SLDataType x);
//void SeqLIstPopBack(SL* ps);
//void SeqLIstPushFront(SL* ps, SLDataType x);
//void SeqLIstPopFront(SL* ps);




typedef int SLDataType;

// 不带头节点的单向非循环链表
// 动态顺序表
typedef struct SeqList {
	SLDataType* a;// 指针指向动态开辟的空间
	int size;     // 数组中存储数据的个数
	int capacity; // 数组实际能存储空间的容量
}SL;

// 静态特点:如果满了就不能插入 缺点:多少大小合适?
// 接口函数
// 打印
void SeqListPrint(SL* ps);
// 初始化
void SeqListInit(SL* ps);
// 销毁
void SeqListDestory(SL* ps);

// 增容
void SeqListCheckCapacity(SL* ps);
// 尾插
void SeqListPushBack(SL* ps, SLDataType x);
// 尾删
void SeqListPopBack(SL* ps);
// 头插
void SeqListPushFront(SL* ps, SLDataType x);
// 头删
void SeqListPopFront(SL* ps);
// ... 

// 查找x的位置下标,没找到返回-1
int SeqListFind(SL* ps, SLDataType x);
// 在第pos个位置插入
void SeqListInsert(SL* ps, int pos, SLDataType x);
// 删除第pos个位置
void SeqListErase(SL* ps, int pos);
// 修改第pos个位置
void SeqListModify(SL* ps, int pos, SLDataType x);


SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"

// 打印
void SeqListPrint(SL* ps)
{
	for (int i = 0; i < ps->size; i++)
		printf("%d ", ps->a[i]);
	printf("\n");
}

// 初始化
void SeqListInit(SL* ps)
{
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}

// 销毁(内存泄漏)
void SeqListDestory(SL* ps)
{
	free(ps->a);// 释放
	ps->a = NULL;// 置为空
	ps->capacity = ps->size = 0;
}

// 增容
void SeqListCheckCapacity(SL* ps)
{
	// 如果没有空间或者空间满了,就扩容
	if (ps->size == ps->capacity)
	{
		// 三目操作符,判断第一次的容量是否为0,
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			printf("AddSeqList::%s\n", strerror(errno));// 将错误码转换成错误信息
			printf("realloc fail\n");
			exit(-1);// 异常退出返回 -1
		}
		ps->a = tmp;// 指向动态开辟的空间
		ps->capacity = newcapacity;// 新的容量大小
	}
}

// 尾插
void SeqListPushBack(SL* ps, SLDataType x)
{
	// 检查增容
	SeqListCheckCapacity(ps);

	ps->a[ps->size] = x;
	ps->size++;
}

// 尾删
void SeqListPopBack(SL* ps)
{
	//if (ps -> size > 0)
	//{
	//	ps->size--;
	//}
	assert(ps->size > 0);
	ps->size--;

}

// 头插
void SeqListPushFront(SL* ps, SLDataType x)
{
	// 检查增容
	SeqListCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[0] = x;
	ps->size++;
}

// 头删
void SeqListPopFront(SL* ps)
{
	assert(ps->size > 0);// 判断有没有值
	int begin = 1;
	while (begin < ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];
		begin++;
	}
	ps->size--;
}

// 查找x的位置下标,没找到返回-1
int SeqListFind(SL* ps, SLDataType x)
{
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
		{
			printf("%d\n", i);
			return 0;
		}
	}
	return -1;
}

// 在第pos个位置插入(pos下标)
void SeqListInsert(SL* ps, int pos, SLDataType x)
{
	assert(pos < ps->size);// 要插入的位置小于顺序表的长度
	SeqListCheckCapacity(ps);// 检查增容

	int end = ps->size - 1;// 找到最后一个元素的下标
	while (end >= pos)// 往后移的循环
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->size++;
}
// 删除第pos个位置(pos下标)
void SeqListErase(SL* ps, int pos)
{
	assert(pos < ps->size);
	int start = pos + 1;
	while (start < ps->size)
	{
		ps->a[start - 1] = ps->a[start];
		start++;
	}
	ps->size--;
}

// 修改第pos个位置
void SeqListModify(SL* ps, int pos, SLDataType x)
{
	assert(pos < ps->size);
	ps->a[pos] = x;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "SeqList.h"

void TestSeqList1()
{
	SL s1;
	SeqListInit(&s1);// 址传递,形参改变实参
	SeqListPushBack(&s1, 1);
	SeqListPushBack(&s1, 2);
	SeqListPushBack(&s1, 3);
	SeqListPushBack(&s1, 4);
	SeqListPushBack(&s1, 5);

	SeqListPopBack(&s1);
	SeqListPopBack(&s1);
	SeqListPopBack(&s1);
	SeqListPopBack(&s1);
	//SeqListPopBack(&s1);
	//SeqListPopBack(&s1);

	SeqListPushBack(&s1, 4);
	SeqListPushBack(&s1, 5);

	SeqListPrint(&s1);


	SeqListDestory(&s1);
}

void TestSeqList2()
{
	SL s1;
	SeqListInit(&s1);// 址传递,形参改变实参
	SeqListPushBack(&s1, 1);
	SeqListPushBack(&s1, 2);
	SeqListPushBack(&s1, 3);
	SeqListPushBack(&s1, 4);
	SeqListPushBack(&s1, 5);

	SeqListPrint(&s1);

	SeqListPushFront(&s1, 10);
	SeqListPushFront(&s1, 20);
	SeqListPushFront(&s1, 30);
	SeqListPushFront(&s1, 40);
	SeqListPushFront(&s1, 50);

	SeqListPrint(&s1);

	SeqListPopFront(&s1);
	SeqListPopFront(&s1);

	SeqListPrint(&s1);

	// !!!如果越界了,一般是不会报错的
	SeqListDestory(&s1);// 动态申请的内存,在释放内存时才会检查是否越界
}
void TestSeqList3()
{
	SL s1;
	SeqListInit(&s1);// 址传递,形参改变实参
	SeqListPushBack(&s1, 1);
	SeqListPushBack(&s1, 2);
	SeqListPushBack(&s1, 3);
	SeqListPushBack(&s1, 4);
	SeqListPushBack(&s1, 5);

	SeqListPrint(&s1);

	//SeqListInsert(&s1, 1,20);
	//SeqListPrint(&s1);

	//SeqListErase(&s1, 1);
	//SeqListPrint(&s1);

	SeqListFind(&s1, 4);
	SeqListModify(&s1, 1, 30);
	SeqListPrint(&s1);


	SeqListDestory(&s1);

}

int main()
{
	//TestSeqList1();
	//TestSeqList2();
	TestSeqList3();
	return 0;
}

你可能感兴趣的:(数据结构与算法,数据结构,c语言,链表)