数据结构与算法2022.5.8

目录

顺序表的C语言实现

SeqList.h 

SeqList.c 

main.c(主要还是测试用的,可以自己写写做测试) 


 

昨天的博客内容是不完整的学习内容,但是有较多注释,看不懂的时候可以返回到上一篇博客

顺序表的C语言实现

SeqList.h 

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//#define N 100
typedef int SLDataType;  //方便修改顺序表的类型

//静态顺序表
//typedef struct SeqList
//{
//	SLDataType a[N];
//	int size;  //表示数组中存放了多少个数据
//}SL;
//
接口函数(方便其他的调用)取名是与C++中的STL库风格一致,方便后续C++学习
//void SeqListInit(SL *ps);
//
静态特点:如果满了就不让插入  缺点:给多少个合适呢?
N给大了浪费空间,N给小了不够用
//void SeqListPushBack(SL *ps,SLDataType x);
//void SeqListPopBack(SL *ps);
//void SeqListPushFront(SL *ps,SLDataType x);
//void SeqListPopFront(SL *ps);

//动态顺序表
typedef struct SeqList
{
	SLDataType *a;
	int size;  //表示数组中存放了多少个数据
	int capacity;//数组实际能存数据的空间容量是多大
}SL;

//接口函数(方便其他的调用)取名是与C++中的STL库风格一致,方便后续C++学习
void SeqListInit(SL* ps);
void SeqListCheckCapacity(SL *ps);
void SeqListPushBack(SL *ps,SLDataType x);
void SeqListDestroy(SL *ps);
void SeqListPopBack(SL *ps);
void SeqListPushFront(SL *ps,SLDataType x);
void SeqListPopFront(SL *ps);
int SeqListFind(SL *ps,SLDataType x);
void SeqListInsert(SL *ps,int pos,SLDataType x);
void SeqListErase(SL *ps,int pos);

void SeqListPrint(SL *ps);

SeqList.c 

 

#include "SeqList.h"

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

void SeqListCheckCapacity(SL *ps)
{
	if(ps -> capacity == ps->size)
	{
		int newcapacity = ps ->capacity *2 == 0 ? 4 : ps->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(ps->a,newcapacity*sizeof(SLDataType));
		if(tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
}

void SeqListPushBack(SL *ps,SLDataType x)
{
	//如果没有空间或者空间不足,我们就扩容(relloc)
	SeqListCheckCapacity(ps);

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

void SeqListDestroy(SL *ps)  //指针的销毁
{
	ps->a = NULL;
	ps->capacity=ps->size=0;
}

void SeqListPopBack(SL *ps)
{
	ps->a[ps->size-1] = 0; 
	//上面这句话可以丢掉,因为原来顺序表的最后一个数据可能本身就是0
	//if(ps->size>0)
	//{
	//	ps->size--;
	//}
	//只需要将顺序表的有效位数减一就可以实现尾删

	assert(ps->size > 0);
	ps->size--;
}

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

void SeqListPushFront(SL *ps,SLDataType x)
//头插,数据往后挪,从后往前挪
{
	int end = ps->size - 1;

	SeqListCheckCapacity(ps);

	while(end >= 0)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[0] = x;
	ps->size++;
}

void SeqListPopFront(SL *ps)
{
	int begin = 1;
	assert(ps->size > 0);
	while(begin < ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];
		++begin;
	}
}

//查找任意位置的数据,没有找到返回-1
int SeqListFind(SL *ps,int pos)
{
	if(pos < ps->size)
		return ps->a[pos-1];
	else
		return -1;
}

//任意位置插入
void SeqListInsert(SL *ps,int pos,SLDataType x)
{
	int end = ps->size;
	SeqListCheckCapacity(ps);
	if(pos < 0 || pos > ps->size)
	{
		printf("Cann't Insert This Place!");
	}
	else
	{
		if(pos == 1)
			SeqListPushFront(ps,x);
		else if(pos == ps->size-1)
			SeqListPushBack(ps,x);
		else
		{
			while(end > pos)
			{
				ps->a[end] = ps->a[end - 1];
				end--;
			}
			ps->size++;
			ps->a[pos-1] = x;
		}
	}
}

//清除任一位置数据
void SeqListErase(SL *ps,int pos)
{
	if(pos < 0 || pos >= ps->size)
	{
		printf("Unable To Erase This Place!");
	}
	else
	{
		while(pos < ps->size)
		{
			ps->a[pos - 1] = ps->a[pos];
			pos++;
		}
		ps->size--;
	}
}

main.c(主要还是测试用的,可以自己写写做测试) 

#include "SeqList.h"

void TestSeqList1()
{
	SL sl;
	SeqListInit(&sl);

	SeqListPushBack(&sl,1);
	SeqListPushBack(&sl,2);
	SeqListPushBack(&sl,3);
	SeqListPushBack(&sl,4);
	SeqListPushBack(&sl,5);

	SeqListPrint(&sl);

	SeqListErase(&sl,1);

	SeqListPrint(&sl);

	SeqListDestroy(&sl);
}

void TestSeqList2()
{
	SL sl;
	SeqListInit(&sl);

	SeqListPushBack(&sl,1);
	SeqListPushBack(&sl,2);
	SeqListPushBack(&sl,3);
	SeqListPushBack(&sl,4);
	SeqListPushBack(&sl,5);

	SeqListPrint(&sl);

	SeqListPushFront(&sl,10);
	SeqListPushFront(&sl,20);
	SeqListPushFront(&sl,30);
	SeqListPushFront(&sl,40);//开始越界了

	SeqListPrint(&sl);

	SeqListPopFront(&sl);
	SeqListPrint(&sl);

	printf("SeqList[1] = %d\n ",SeqListFind(&sl,2));

	SeqListDestroy(&sl);
	//理论上,动态申请内存释放时将检查内存是否越界,我这里应该有个越界的,
	//但是我这里不知道为什么,加了SeqListDestroy()函数还是释放内存的时候没有报错
}

int main()
{
	TestSeqList1();
	//TestSeqList2();

	return 0;
}

准备写个通讯录,但是考虑到我们常用的电话号码都是11位的,而int最大值是10位的,所以写通讯录的时候要将顺序表的数据类型改成long (感觉太浪费空间了),等下篇博客看看吧!要继续坚持呀!加油!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值