数据结构:顺序表简单功能实现

 头文件Seqlist.h   包含了顺序表的增删查改以及冒泡排序和二分法及一些简单功能实现

#pragma once
#include <stdlib.h>

typedef int SLDataType;

typedef struct SeqList
{
	SLDataType* array; // 指向动态开辟的数组
	size_t size; // 有效数据个数
	size_t capicity; // 容量空间的大小
}SeqList;


// 基本增删查改接口
//初始化
void SeqListInit(SeqList* psl, size_t capacity);
//销毁
void SeqListDestory(SeqList* psl);
//扩容
void CheckCapacity(SeqList* psl);

//尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
//尾删
void SeqListPopBack(SeqList* psl);

//头插
void SeqListPushFront(SeqList* psl, SLDataType x);
//头删
void SeqListPopFront(SeqList* psl);

//查找
//没有找到返回-1
int SeqListFind(SeqList* psl, SLDataType x);

//在pos所在的下标做数据插入
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);

//删除pos对应数据
void SeqListErase(SeqList* psl, size_t pos);

//删除第一个x
void SeqListRemove(SeqList* psl, SLDataType x);

//修改pos下标的数据为x
void SeqListModify(SeqList* psl, size_t pos, SLDataType x);

void SeqListPrint(SeqList* psl);

//冒泡排序
void SeqListBubbleSort(SeqList* psl); 

//二分查找(数据有序)
int SeqListBinaryFind(SeqList* psl, SLDataType x);

//删除所有遇到的x
void SeqListRemoveAll(SeqList* psl, SLDataType x);


 Seqlist.c    这是对头文件Seqlist.h中函数声明的定义

#include "Seqlist.h"
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>

void SeqListInit(SeqList* psl, size_t capacity)
{
	assert(psl != NULL);
	psl->array = (SLDataType *)malloc(capacity* sizeof(SLDataType));
	psl->size = 0;
	psl->capicity = capacity;

}

void SeqListDestory(SeqList* psl)
{
	assert(psl != NULL);
	free(psl->array);
	psl->array = NULL;
	psl->capicity = 0;
	psl->size = 0;
}

void CheckCapacity(SeqList* psl)
{
	assert(psl);
	if (psl->size<psl->capicity)
	{
		return;
	}
	int newcapicity = 2 * psl->capicity;
	SLDataType * newarray = (SLDataType*)malloc(newcapicity*sizeof(SeqList));
	assert(newarray);
	for (size_t i = 0; i < psl->size; i++)
	{
		newarray[i] = psl->array[i];
	}
	free(psl->array);
	assert(psl->array == NULL);
	psl->array = newarray;
	psl->capicity = newcapicity;

}

void SeqListPushBack(SeqList* psl, SLDataType x)
{
	assert(psl);
	CheckCapacity(psl);
	psl->array[psl->size]=x;
	psl->size++;
}

void SeqListPopBack(SeqList* psl)
{
	assert(psl);
	if (psl->size<1)
	{
		return;
	}
	psl->size--;
}

void SeqListPushFront(SeqList* psl, SLDataType x)
{
	assert(psl);

	for (size_t i = psl->size; i >0; i++)
	{
		psl->array[psl->size] = psl->array[psl->size - 1];
	}
	psl->size++;
	psl->array[0] = x;

}

void SeqListPopFront(SeqList* psl)
{
	assert(psl);
	assert(psl->size > 0);
	for (size_t i = 0; i <psl->size-1; i++)
	{
		psl->array[i] = psl->array[i + 1];
	}
	psl->size--;
}

int SeqListFind(SeqList* psl, SLDataType x)
{
	assert(psl);
	for (size_t i = 0; i < psl->size; i++)
	{
		if (psl->array[i] == x)
		{
			return i;
		}
	}
	return -1;
}

void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)
{
	assert(psl);
	CheckCapacity(psl);
	assert(pos >= 0 && pos <= psl->size);

	for (int i = psl->size; i>(int)pos ; i--)
	{
		psl->array[i] = psl->array[i - 1];
	}
	psl->size++;
	psl->array[pos] = x;

}

void SeqListErase(SeqList* psl, size_t pos)
{
	assert(psl);
	assert(psl->size > 0);
	assert(pos >= 0 && pos <= psl->size);
	for (size_t i = pos; i < psl->size-1; i++)
	{
		psl->array[i] = psl->array[i + 1];
	}
	psl->size--;

}

void SeqListRemove(SeqList* psl, SLDataType x)
{
	assert(psl);
	for (size_t i = 0; i < psl->size; i++)
	{
		if (x == psl->array[i])
		{
			SeqListErase(psl, i);
			break;
		}
	}
}
1
void SeqListModify(SeqList* psl, size_t pos, SLDataType x)
{
	assert(psl);
	assert(pos >= 0 && pos < psl->size);
	psl->array[pos] = x;
}

void SeqListPrint(SeqList* psl)
{
	for (size_t i = 0; i < psl->size; i++)
	{
		printf("%d ", psl->array[i]);	
	}
	printf("\n");
}

void SeqListBubbleSort(SeqList* psl)
{
	assert(psl);
	for (size_t i = 0; i < psl->size -1; i++)
	{
		int flag =0;
		for (size_t j = 0; j < psl->size - 1 - i; j++)
		{
			if (psl->array[j] >= psl->array[j + 1])
			{
				int temp = psl->array[j];
				psl->array[j] = psl->array[j + 1];
				psl->array[j + 1] = temp;
				flag = 1;
			}
		}
		if (flag==0)
		{
			return;
		}
	}
}

int SeqListBinaryFind(SeqList* psl, SLDataType x)
{	
	SeqListBubbleSort(psl);
	int left = 0;
	int right = psl->size ;
	while (left>right)
	{
		int mid = left+(right-left) / 2;
		if (x == psl->array[mid] )
		{
			return mid ;
		}
		else if (x < psl->array[mid])
		{
			right = mid;
		}
		else
		{
			left = mid+1;
		}
	}
	return -1;

}

void SeqListRemoveAll(SeqList* psl, SLDataType x)
{
	assert(psl);
	int j = 0;
	for (size_t i = 0; i < psl->size; i++)
	{
		if (x != psl->array[i])
		{
			//psl->array[j++] = psl->array[i];
			psl->array[j] = psl->array[i];
			j++;			
		}
	}
	psl->size = j;

}

简单的不全的测试代码 

#include "SeqList.h"
#include <stdlib.h>


void TestSeqList()
{
	SeqList seqlist;
	SeqListInit(&seqlist,5);
	SeqListPushBack(&seqlist, 1);
	SeqListPushBack(&seqlist, 2);
	SeqListPushBack(&seqlist, 2);
	SeqListPushBack(&seqlist, 3);
	SeqListPushBack(&seqlist, 2);

	SeqListPrint(&seqlist);

	SeqListRemoveAll(&seqlist, 2);

	SeqListPrint(&seqlist);

	SeqListDestory(&seqlist);

}

int main()
{
	TestSeqList();
	system("pause");
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值