C语言实现顺序表

SeqList.h

#ifndef __SEQLIST_H__
#define __SEQLIST_H__

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

typedef int DataType; //顺序表的元素类型
#define N 100 //顺序表的数组大小
typedef struct SeqList
{
	DataType data[N];
	size_t _size;
}SeqList;


void SeqListInit(SeqList* pSeq);//初始化
void SeqListPrint(SeqList* pSeq);//打印顺序表
void SeqListPushBack(SeqList* pSeq, DataType x);//尾插
void SeqListPopBack(SeqList* pSeq);//尾删
void SeqListPushFront(SeqList* pSeq, DataType x);//头插
void SeqListPopFront(SeqList* pSeq);//头删
void SeqListInsert(SeqList* pSeq, size_t pos, DataType x);//任意pos位置的插入
void SeqListErase(SeqList* pSeq, size_t pos);//任意位置的删除
int SeqListFind(SeqList* pSeq, DataType x);//查找
void SeqListModify(SeqList* pSeq, size_t pos, DataType x);//修改pos位置的元素
void SeqListRemove(SeqList* pSeq, DataType x);//删除x   FIND+ERASE
void SeqListRemoveAll(SeqList* pSeq, DataType x);//将所有的x删掉  
void Swap(DataType* left, DataType* right);//交换
void SeqListBubbleSort(SeqList* pSeq);//冒泡排序
int SeqListBinarySearch(SeqList* pSeq, DataType x);//二分查找


#endif //__SEQLIST_H__

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"

//初始化
void SeqListInit(SeqList* pSeq)
{
	assert(pSeq);
	memset(pSeq->data, 0, sizeof(DataType)*N);
	pSeq->_size = 0;
}
//打印顺序表
void SeqListPrint(SeqList* pSeq)
{
	int i = 0;
	for (; i < pSeq->_size; i++)
	{
		printf("%d", pSeq->data[i]);
	}
	printf("\n");
}
//尾插
void SeqListPushBack(SeqList* pSeq, DataType x)
{
	assert(pSeq);
	if (pSeq->_size >= N)
	{
		printf("SeqList is full\n");
		return;
	}
	else
	{
		pSeq->data[pSeq->_size] = x;
		pSeq->_size++;
	}
}
//尾删
void SeqListPopBack(SeqList* pSeq)
{
	assert(pSeq);
	if (pSeq->_size == 0)
	{
		printf("SeqList is empty\n");
		return;
	}
	else
	{
		pSeq->_size--;
	}
}
//头插
void SeqListPushFront(SeqList* pSeq, DataType x)
{
	assert(pSeq);
	if (pSeq->_size >= N)
	{
		printf("SeqList is full\n");
		return;
	}
	else
	{
		int end = pSeq->_size - 1;
		while (end >= 0)
		{
			pSeq->data[end + 1] = pSeq->data[end];
			end--;
		}
		//int i = 0;
		//for (i = pSeq->_size; i > 0; i--)
		//{
		//	pSeq->data[i] = pSeq->data[i - 1];
		//}
		pSeq->data[0] = x;
		pSeq->_size++;
	}
}

//头删
void SeqListPopFront(SeqList* pSeq)
{
	assert(pSeq);
	if (pSeq->_size == 0)
	{
		printf("SeqList is empty\n");
		return;
	}
	else
	{
		int i = 0;
		for (; i < pSeq->_size; i++)
		{
			pSeq->data[i] = pSeq->data[i + 1];
		}
		pSeq->_size--;
	}
}
//在pos位置插入元素x
void SeqListInsert(SeqList* pSeq, size_t pos, DataType x)
{
	assert(pSeq);
	if (pSeq->_size >= N)
	{
		printf("SeqList is full\n");
		return;
	}
	else
	{
		int end = pSeq->_size - 1;
		for (; end >= pos; end--)
		{
			pSeq->data[end + 1] = pSeq->data[end];
		}           
		pSeq->data[pos] = x;
		pSeq->_size++;
	}
}
//删除pos位置的元素
void SeqListErase(SeqList* pSeq, size_t pos)
{
	assert(pSeq && pos < pSeq->_size);
	if (pSeq->_size == 0)
	{
		printf("SeqList is empty\n");
		return;
	}
	else
	{
		int i = pos;
		while (i < pSeq->_size)
		{
			pSeq->data[i] = pSeq->data[i + 1];
			i++;
		}
		pSeq->_size--;
	}
}
//查找元素x
int SeqListFind(SeqList* pSeq, DataType x)
{
	assert(pSeq);
	int i = 0;
	for (; i < pSeq->_size; i++)
	{
		if (pSeq->data[i] == x)
		{
			return i;
		}
	}
	return - 1;
}
//将pos位置的元素改为元素x
void SeqListModify(SeqList* pSeq, size_t pos, DataType x)
{
	assert(pSeq && pos < pSeq->_size);
	pSeq->data[pos] = x;
}
//删除第一次出现的x
void SeqListRemove(SeqList* pSeq, DataType x)
{
	assert(pSeq);
	int ret = 0;
	if (pSeq->_size == 0)
	{
		printf("SeqList is empty\n");
		return;
	}
	else
	{
		ret = SeqListFind(pSeq, x);
		SeqListErase(pSeq, ret);
	}
}
//删除所有的x
void SeqListRemoveAll(SeqList* pSeq, DataType x)
{
	assert(pSeq);
	//int ret = 0;
	//while ((ret = SeqListFind(pSeq, x)) != -1)
	//{
	//	SeqListRemove(pSeq, x);
	//}
	int index = 0;
	int count = 0;
	int i = 0;
	for (; i < pSeq->_size; i++)
	{
		if (pSeq->data[i] != x)
		{
			pSeq->data[index] = pSeq->data[i];
			index++;
		}
		else
		{
			count++;
		}
	}
	pSeq->_size -= count;
}
//交换
void Swap(DataType* left, DataType* right)
{
	DataType tmp = *left;
	*left = *right;
	*right = tmp;
}
//冒泡排序
void SeqListBubbleSort(SeqList* pSeq)
{
	assert(pSeq);
	int i = 0;
	int j = 0;
	int flags = 0;
	for (; i < pSeq->_size; i++)
	{
		int flags = 1;
		for (; j < pSeq->_size - i - 1; j++)
		{
			if (pSeq->data[j]>pSeq->data[j + 1])
			{
				Swap(&pSeq->data[j], &pSeq->data[j + 1]);
				flags = 0;
			}
		}
		if (flags)
		{
			break;
		}
	}
}
//二分查找
int SeqListBinarySearch(SeqList* pSeq, DataType x)
{
	assert(pSeq);
	int left = 0;
	int right = pSeq->_size - 1;
	int mid = left + (right - left) >> 1;
	while (left < right)
	{
		if (pSeq->data[mid] < x)
		{
			left = mid + 1;
		}
		else if (pSeq->data[mid]>x)
		{
			right = mid - 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"


void test1()
{
	SeqList s;
	SeqListInit(&s);
	SeqListPushBack(&s, 1);
	SeqListPushBack(&s, 2);
	SeqListPushBack(&s, 3);
	SeqListPushBack(&s, 4);
	SeqListPushBack(&s, 5);
	//SeqListPushBack(&s, 2);

	SeqListPrint(&s);
	//SeqListPopBack(&s);
	//SeqListModify(&s, 3, 6);
	//SeqListRemove(&s, 2);
	//SeqListRemoveAll(&s, 2);
	//SeqListBubbleSort(&s);
	int ret = 0;
	ret = SeqListBinarySearch(&s, 3);
	printf("%d\n", ret);
	//SeqListPrint(&s);

}

void test2()
{
	SeqList s;
	int ret = 0;
	SeqListInit(&s);
	SeqListPushFront(&s, 1);
	SeqListPushFront(&s, 2);
	SeqListPushFront(&s, 3);
	SeqListPushFront(&s, 4);
	SeqListPushFront(&s, 5);
	SeqListPrint(&s);
	SeqListPopFront(&s);
	//SeqListInsert(&s, 3, 6);
	SeqListPrint(&s);
	//SeqListErase(&s, 3);
	//SeqListPrint(&s);
	//ret = SeqListFind(&s, 2);
	//printf("%d\n", ret);

}


int main()
{
	test1();
	system("pause");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值