【C语言】动态顺序表的实现

SeqList.h

#ifndef __SEQLIST_H__
#define __SEQLIST_H__

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>

#define DEFAULT_SZ 2
#define INC 1

typedef int DataType;

typedef struct SeqList
{
	DataType *data;
	int sz;
	int capacity;
}SeqList, *pSeqList;

void InitSeqList(pSeqList ps);
void PushBack(pSeqList ps, DataType d);
void PopBack(pSeqList ps);
void Display(const pSeqList ps);
void PushFront(pSeqList ps, DataType d);
void PopFront(pSeqList ps);
int Find(pSeqList ps, DataType d);
void Insert(pSeqList ps, DataType d, int pos);
void Remove(pSeqList ps, DataType d);
void RemoveAll(pSeqList ps, DataType d);
void Reverse(pSeqList ps);
void Sort(pSeqList ps);
int BinarySearch(pSeqList ps, DataType d);
void CheckCapacity(pSeqList ps);
void DestorySeqlist(pSeqList ps);

#endif //__SEQLIST_H__

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"

void InitSeqList(pSeqList ps)//初始化
{
	assert(ps);

	ps->sz = 0;
	ps->data = malloc(sizeof(DataType)*DEFAULT_SZ);

	if (ps->data == NULL)
	{
		perror("malloc");
		exit(EXIT_FAILURE);
	}
	memset(ps->data, 0, DEFAULT_SZ*sizeof(DataType));
	ps->capacity = DEFAULT_SZ;
}

void CheckCapacity(pSeqList ps)
{
	if (ps->capacity == ps->sz)
	{
		DataType* ptr = realloc(ps->data, sizeof(DataType)*(ps->capacity + INC));
		if (ptr == NULL)
		{
			perror("realloc");
			exit(EXIT_FAILURE);
		}
		else
		{
			ps->data = ptr;
		}
		ps->capacity += INC;
		printf("增容成功!\n");
	}
}

void PushBack(pSeqList ps, DataType d)//尾插
{
	assert(ps);

	CheckCapacity(ps);
	ps->data[ps->sz] = d;
	ps->sz++;
	/*printf("尾插成功!\n");*/
}

void PopBack(pSeqList ps)//尾删
{
	assert(ps);

	if (ps->sz == 0)
	{
		printf("顺序表已为空,不可删除!\n");
		exit(EXIT_FAILURE);
	}
	ps->sz--;
	/*printf("尾删成功!\n");*/
}

void Display(const pSeqList ps)//打印
{
	assert(ps);
	int i = 0;

	for (i = 0; i < ps->sz; i++)
	{
		printf("%d ", ps->data[i]);
	}
	printf("\n");
}

void PushFront(pSeqList ps, DataType d)//头插
{
	int i = 0;
	assert(ps);

	CheckCapacity(ps);
	//从后往前
	for (i = ps->sz-1; i >= 0; i--)
	{
		ps->data[i+1] = ps->data[i];
	}
	ps->data[0] = d;
	ps->sz++;
	/*printf("头插成功!\n");*/
}

void PopFront(pSeqList ps)//头删
{
	int i = 0;
	assert(ps);

	if (ps->sz == 0)
	{
		printf("顺序表已为空,不可删除!\n");
		exit(EXIT_FAILURE);
	}
	//从前往后删除
	for (i = 0; i < ps->sz; i++)
	{
		ps->data[i] = ps->data[i + 1];
	}
	ps->sz--;
	/*printf("头删成功!\n");*/
}

int Find(pSeqList ps, DataType d)//查找d是否在顺序表中,是,返回下标,不是,返回-1
{
	int i = 0;
	assert(ps);

	for (i = 0; i < ps->sz; i++)
	{
		if (ps->data[i] == d)
		{
			return i;
		}
	}
	return -1;
}

void Insert(pSeqList ps, DataType d, int pos)//在给定位置插入元素
{
	assert(ps);

	CheckCapacity(ps);
	memmove(ps->data + pos + 1, ps->data + pos, sizeof(DataType)* (ps->sz - pos));
	ps->data[pos] = d;
	ps->sz++;
}

void Remove(pSeqList ps, DataType d)//删除给定元素
{
	int pos = Find(ps, d);
	assert(ps);

	if (pos!=-1)
	{
		memmove(ps->data + pos , ps->data + pos+1, sizeof(DataType)*(ps->sz - pos-1));
		ps->sz--;
	}
	/*printf("删除成功!\n");*/
}

void RemoveAll(pSeqList ps, DataType d)//删除所有给定元素
{
	int i = 0;
	int pos = 0;
	assert(ps);

	if (ps->sz == 0)
	{
		printf("顺序表已为空,不可删除!\n");
		exit(EXIT_FAILURE);
	} 
	while (pos != -1)
	{
		Remove(ps, d);
		pos = Find(ps, d);
	}
}

void Reverse(pSeqList ps)//逆序
{
	int i = 0;
	DataType tmp = 0;
	assert(ps);

	for (i = 0; i < ps->sz; i++)
	{
		tmp = ps->data[ps->sz - 1];
		ps->data[ps->sz - 1] = ps->data[i];
		ps->data[i] = tmp;
	}
}

void Sort(pSeqList ps)//排序
{
	int i = 0;
	int j = 0;
	DataType tmp = 0;
	assert(ps);

	for (i = 0; i < ps->sz - 1; i++)
	{
		for (j = 0; j < ps->sz - i - 1; j++)
		{
			if (ps->data[j]>ps->data[j + 1])
			{
				tmp = ps->data[j];
				ps->data[j] = ps->data[j + 1];
				ps->data[j + 1] = tmp;
			}
		}
	}
}

int BinarySearch(pSeqList ps, DataType d)//二分查找
{
	int left = 0;
	int right =  ps->sz - 1;
	int mid = 0;
	assert(ps);

	while (left <= right)
	{
		mid = (left + right) >> 1;
		if (ps->data[mid] == d)
		{
			return mid;
		}
		else if (d < ps->data[mid])
		{
			right = mid - 1;
		}
		else
		{
			left = mid + 1;
		}
	}
	return -1;
}

void DestorySeqlist(pSeqList ps)
{
	free(ps->data);
	ps->data = NULL;
	ps->sz = 0;
	ps->capacity = 0;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"

test()
{
	SeqList my_list;
	InitSeqList(&my_list);//初始化
	PushBack(&my_list, 1);//尾插1,2,3
	PushBack(&my_list, 2);
	Display(&my_list);//打印
	PushBack(&my_list, 3);
	Display(&my_list);//打印
	PopBack(&my_list);//尾删3
	Display(&my_list);//打印


	PushFront(&my_list, 5);//头插5,6,7
	PushFront(&my_list, 6);
	PushFront(&my_list, 7);
	Display(&my_list);//打印


	PopFront(&my_list);//头删5
	PopFront(&my_list);//头删6
	PopFront(&my_list);//头删7
	Display(&my_list);//打印


	int pos=Find(&my_list, 2);//查找
	if (pos == -1)
	{
		printf("没有找到!\n");
	}
	else
	{
		printf("下标为:");
		printf("%d ", pos);
		printf("找到了\n");
	}


	Insert(&my_list, 6, 2);//在下标为2的位置插入6
	Display(&my_list);//打印

	Remove(&my_list, 2);//删除2
	PushBack(&my_list, 1);//尾插1,2
	PushBack(&my_list, 2);
	Display(&my_list);

	RemoveAll(&my_list,1);//删除所有指定元素
	Display(&my_list);

	Reverse(&my_list);//逆序
	Display(&my_list);

	
	PushFront(&my_list, 5);//头插5,6,7
	PushFront(&my_list, 6);
	PushFront(&my_list, 7);
	Sort(&my_list);//排序
	Display(&my_list);

	int mid=BinarySearch(&my_list, 7);
	if (mid == -1)
	{
		printf("没有找到!\n");
	}
	else
	{
		printf("下标为:");
		printf("%d ", mid);
		printf("找到了\n");
	}
        DestorySeqlist(&my_list);
}
int main()
{
	test();

	system("pause:");
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值