C语言_顺序表操作

####本片博客主要包含顺序表以下几个操作:

1、 初始化顺序表
2、 尾部插入
3、 尾部删除
4、头部插入
5、头部删除
6、 指定位置插入
7、 指定位置删除
8、 删除指定元素(第一次出现的那一个)
9、 删除所有指定元素 (三种方法)
10、查找指定元素 ,返回其下标,没有那个元素就返回 -1
11、返回顺序表大小
12、判断顺序表是否为空
13、冒泡排序
14、选择排序
15、选择排序的优化
16、二分查找(非递归写法)
17、二分查找 (递归写法)
18、打印顺序表内容

1、头文件 SequList.h

#ifndef __SeqLIst_h__
#define __SeqLIst_h__

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

#define MAX 10 
typedef int DataType;


typedef struct SeqList
{
	DataType data[MAX];
	int sz;
}SeqList;
//显示内容
void show(SeqList *pList);

//初始化
void SeqListInit (SeqList *pList);
//尾部插入 
void SeqListPushBack (SeqList *pList, DataType d);
//尾部删除
void SeqListPopBack (SeqList *pList);

//头部插入 
void SeqListPushFront (SeqList *pList, DataType d);
//头部删除 
void SeqListPopFront (SeqList *pList);
//指定位置插入 
void SeqLIstInsert (SeqList *pList, int pos, DataType d);
//删除指定位置元素 
void SeqLIstErase (SeqList *pList, int pos);
//删除指定元素 
void SeqListRemove(SeqList *pList, DataType d);
//删除所有的指定元素 (方法一)
void SeqListRemoveAll_1(SeqList *pList, DataType d);
//删除所有的指定元素 (方法二)
void SeqListRemoveAll_2(SeqList *pList, DataType d);
//删除所有的指定元素 (方法三)
void SeqListRemoveAll_3(SeqList *pList, DataType d);
//查找指定元素 
int SeqListFind (SeqList *pList, DataType d);
//返回顺序表大小
int SeqListsz (SeqList *pList);
//判断顺序表是否为空 
int Empty(SeqList *pList); 
//冒泡排序 
void BubbleSort (SeqList *pList);
//选择排序
void SelectSort (SeqList *pList);
//选择排序的优化 
void  SelectSort_OP (SeqList *pList);
//二分查找 
int BinarySearch (SeqList *pList, DataType d);
//二分查找递归写法 
int BinarySearch_R(SeqList *pList, int left, int right, DataType d);

#endif

2、主要函数 代码 main.c

#include "SeqList.h"

void show(SeqList *pList)
{
	int i = 0;
	assert (pList != NULL);
	printf ("顺序表内容:\n");
	for (i=0; i<pList->sz; i++)
	{
		printf ("%d ", pList->data[i]);
	}
	printf ("\n");
}

void SeqListInit (SeqList *pList)
{
	assert (pList != NULL);
	memset (pList->data, 0, sizeof (DataType)*MAX);
	pList->sz = 0;
	printf ("初始化成功!!\n");
}

void SeqListPushBack (SeqList *pList, DataType d)
{
	assert (pList != NULL);
	if (pList->sz == MAX)
	{
		printf ("顺序表已满,无法插入!\n");
		return ;
	}
	pList->data[pList->sz] = d;
	pList->sz ++;
	printf ("插入成功\n");
}

void SeqListPopBack (SeqList *pList)
{
	assert (pList != NULL);
	if (pList->sz == 0)
	{
		printf ("顺序表为空,无法删除!\n");
		return ;
	}
	pList->sz --;
	printf ("删除成功\n");
	show (pList);
}

void SeqListPushFront (SeqList *pList, DataType d)
{
	int i = 0;
	assert (pList != NULL);
	if (pList->sz == MAX)
	{
		printf ("顺序表已满,无法插入!\n");
		return ;
	}
	for (i=pList->sz; i>0; i--)
	{
		pList->data[i] = pList->data[i-1];
	}
	pList->data[0] = d;
	pList->sz++;
	printf ("插入成功\n");
	show (pList);
	
}

void SeqListPopFront (SeqList *pList)
{
	int i = 0;
	assert (pList != NULL);
	if (pList->sz == 0)
	{
		printf ("顺序表为空,无法删除!\n");
		return ;
	}
	for (i=0; i<pList->sz; i++)
	{
		pList->data[i] = pList->data[i+1];
	}
	pList->sz --;
	printf ("删除成功\n");
	show (pList);
}

void SeqLIstInsert (SeqList *pList, int pos, DataType d)
{
	int i = 0;
	assert (pList != NULL && pos>0 && pos<pList->sz);
	if (pList->sz == MAX)
	{
		printf ("顺序表已满,无法插入!\n");
		return ;
	}
	for (i=pList->sz; i>=pos; i--)
	{
		pList->data[i] = pList->data[i-1];
	}
	pList->data[pos-1] = d;
	pList->sz ++;
	printf ("插入成功");
	show (pList);
}

void SeqLIstErase (SeqList *pList, int pos)
{
	int i = 0;
	assert (pList != NULL);
	if (pList->sz == 0)
	{
		printf ("顺序表为空,无法删除!\n");
		return ;
	}
	for (i=pos-1; i<pList->sz-1;i++)
	{
		pList->data[i] = pList->data[i+1];
	}
	pList->sz --;
	printf ("删除成功\n");
	show(pList);
}

void SeqListRemove(SeqList *pList, DataType data)//删除指定元素
{
	int i = 0;
	assert (pList != NULL);
	if (pList ->sz == 0)
	{
		printf ("顺序表为空,无法删除!!!\n");
		return;
	}
	for (i=0; i<pList->sz; i++)
	{
		if (pList ->data [i] == data)
		{
			for (; i<pList->sz -1; i++)
			{
				pList->data[i] = pList->data[i+1];
			}
			pList->sz --;
			printf ("删除指定元素成功!!!\n");
			return;
		}
	}
	printf ("没有该元素,无法删除!!!\n");
}

void SeqListRemoveAll_1(SeqList *pList, DataType data)//删除所有指定元素(方法一)
{
	int i = 0, j = 0;
	int tmp = pList->sz ;
	assert (pList != NULL);
	if (pList->sz == 0)
	{
		printf ("顺序表为空,无法删除!!!\n");
		return;
	}
	for (i=0; i<pList->sz; i++)
	{
		if(pList->data[i] == data)
		{
			for (j=i; j<pList->sz-1; j++)
			{
				pList->data[j] = pList->data[j+1];
			}
			pList->sz --;
			i--;
		}
	}
	if (tmp == pList->sz)
	{
		printf ("没有该元素,无法删除!!!\n");
	}
	else
	{
		printf ("所有指定元素(方法一)删除成功!!!\n");
	}
	show (pList);
}

void SeqListRemoveAll_2(SeqList *pList, DataType data)//删除所有指定元素(方法二)
{
	int i = 0, j = 0;
	DataType p[MAX] = {0};
	if (p == NULL)
	{
		perror ("malloc:");
		return;
	}
	
	assert (pList != NULL);
	if (pList->sz == 0)
	{
		printf ("顺序表为空,无法删除!!!\n");
		return;
	}
	for (i=0; i<pList->sz; i++)
	{
		if (pList->data[i] != data)
		{
			p[j] = pList->data [i];
			j++;
			
		}
	}
	memcpy (pList->data,p, sizeof(p));
	pList->sz = j;
	printf("删除指定元素(方法二)成功!!!\n");
	show(pList);
}

void SeqListRemoveAll_3(SeqList *pList, DataType d)
{
	int i = 0, j = 0;
	assert (pList != NULL);
	if (pList->sz == 0)
	{
		printf ("顺序表为空,无法删除!\n");
		return ;
	}
	for (i=0; i<pList->sz; i++)
	{
		if (pList->data[i] != d)
		{
			pList->data[j] = pList->data[i];
			j++;
		}
	}
	pList->sz = j;
	printf ("删除成功\n");
	show (pList);
}

int SeqListFind (SeqList *pList, DataType d)//找到返回下标,找不到返回-1
{
	int i = 0, j = 0;
	assert (pList != NULL);
	for (i=0; i<pList->sz; i++)
	{
		if (pList->data[i] == d)
		{
			printf ("找到了,");
			return i;
		}
	}
	printf("找不到\n");
	return -1;
}

int SeqListsz (SeqList *pList)
{
	return pList->sz;
}

int Empty(SeqList *pList)//为空返回1,不为空返回0
{
	return (pList->sz == 0);//如果pList->sz == 0 ,顺序表为空 返回1 如果pList->sz != 0 顺序表不为空,返回零
}


void swap (int *p, int *q)
{
	int tmp = *p;
	*p = *q;
	*q = tmp;
}

void BubbleSort (SeqList *pList)
{
	int i = 0, j = 0;
	int state = 0;
	assert (pList != NULL);
	for (i=0; i<pList->sz-1; i++)
	{
		state = 0;
		for (j=0; j<pList->sz-1-i; j++)
		{
			if (pList->data[j] > pList->data[j+1])
			{
				swap (pList->data+j, pList->data+j+1);
				state = 1;
			}
		}
		if (state == 0)
		{
			break;
		}
	}
	printf ("冒泡排序成功\n");
	show (pList);
}

void SelectSort (SeqList *pList)
{
	int i = 0, j = 0;
	int maxPos = 0;
	assert (pList != NULL);
	for (i=0; i<pList->sz-1; i++)
	{
		maxPos = 0;
		for (j=1; j<=pList->sz-1-i; j++)
		{
			if (pList->data[j] > pList->data[maxPos])
			{
				maxPos = j;
			}
		}
		swap (pList->data+pList->sz-1-i, pList->data+maxPos);
	}
	printf ("选择排序成功\n");
	show (pList);
}

void  SelectSort_OP (SeqList *pList)
{
	int left = 0, right = pList->sz-1;
	assert (pList != NULL);
	while (left < right)
	{
		int minPos = left;
		int maxPos = left;
		int i = 0;
		for (i=left+1; i<=right; i++)
		{
			if (pList->data[i] > pList->data[maxPos])
			{
				maxPos = i;
			}
			if (pList->data[i] < pList->data[minPos])
			{
				minPos = i;
			}
		}
		if (maxPos != right)
		{
			swap (pList->data+maxPos, pList->data+right);
		}
		if (minPos == right)
		{
			minPos = maxPos;
		}
		if (minPos != left)
		{
			swap (pList->data+minPos, pList->data+left);
		}
		left ++;
		right --;
	}
	printf ("选择排序成功\n");
	show (pList);
}

int BinarySearch (SeqList *pList, DataType d)//找到返回下标,找不到返回-1
{
	int left = 0, right = pList->sz-1;
	int mid = (left+right)/2;
	assert (pList != NULL);
	while (left < right)
	{
		if (pList->data[mid] > d)
		{
			right = mid - 1;
		}
		if (pList->data[mid] < d)
		{
			left = left + 1;
		}
		if (pList->data[mid] == d)
		{
			printf ("找到了,");
			return mid;
		}
	}
	printf ("找不到该元素!\n");
	return -1;
}

int BinarySearch_R(SeqList *pList, int left, int right, DataType d)
{
	int mid = (right + left)/2;
	assert (pList != NULL);
	if (pList->data [mid] > d)
	{
		return BinarySearch_R (pList, left, mid-1, d);
	}
	else if (pList->data [mid] < d)
	{
		return BinarySearch_R (pList, mid+1, right, d);
	}
	else
	{
		return mid;
	}
	if (left > right)
	{
		return -1;
	}
}

3、测试功能代码 test.c

#include "SeqList.h"

void test_SeqListPushBack ()
{
	SeqList pList;
	printf ("测试尾插:\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 4);
	show(&pList);
	printf ("\n");
}

void test_SeqListPopBack ()
{
	SeqList pList;
	printf ("测试尾删\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 4);
	show(&pList);
	SeqListPopBack (&pList);
	printf ("\n");

}

void test_PushFront()
{
	SeqList pList;
	printf ("测试头插:\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 4);
	show(&pList);
	SeqListPushFront(&pList, 10);
	SeqListPushFront(&pList, 11);
	printf ("\n");
}
void teat_SeqListPopFront()
{
	SeqList pList;
	printf ("测试头删:\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 4);
	show(&pList);
	SeqListPopFront(&pList);
	SeqListPopFront(&pList);
	printf ("\n");

}
void teat_SeqLIstInsert ()
{
	SeqList pList;
	printf ("指定位置插入:\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 4);
	show(&pList);
	SeqLIstInsert (&pList, 2, 100);
	printf ("\n");
}

void test_SeqLIstErase()
{
	SeqList pList;
	SeqListInit (&pList);
	printf ("指定位置删除\n");
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 4);
	show(&pList);
	SeqLIstErase(&pList, 2);
	printf ("\n");
}
void test_SeqListRemove()
{
	SeqList pList;
	printf ("删除指定元素(第一次出现):\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 4);
	show(&pList);
	SeqListRemove(&pList,3);
	printf ("\n");
}
void test_SeqListRemoveAll()
{
	SeqList pList;
	printf ("删除指定元素(所有):\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 4);
	SeqListPushBack(&pList, 4);
	SeqListPushBack(&pList, 5);
	SeqListPushBack(&pList, 5);
	show(&pList);
	SeqListRemoveAll_1(&pList, 5);
	SeqListRemoveAll_2(&pList, 4);
	SeqListRemoveAll_3(&pList, 3);
	printf ("\n");
}
void test_SeqListFind ()
{
	int ret = 0;
	SeqList pList;
	printf ("查找元素:\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 4);
	show(&pList);
	ret = SeqListFind (&pList, 3);
	if (ret != -1)
	{
		printf ("下标是:%d\n", ret);
	}
	ret = SeqListFind (&pList, 13);
	if (ret != -1)
	{
		printf ("下标是:%d\n", ret);
	}
	printf ("\n");
}
void test_SeqListsz()
{
	SeqList pList;
	SeqListInit (&pList);
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 4);
	printf ("顺序表长度是:%d\n", SeqListsz (&pList));
	printf ("\n");
}

void test_Bubblesort ()
{
	SeqList pList;
	printf ("冒泡排序:\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 4);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 1);
	show(&pList);
	BubbleSort (&pList);
	printf ("\n");
}
void test_SelectSort()
{
	SeqList pList;
	printf ("选择排序:\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 5);
	SeqListPushBack(&pList, 4);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 0);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 1);
	show(&pList);
	SelectSort(&pList);
	printf ("\n");
}

void test_SelectSort_OP()
{
	SeqList pList;
	printf ("选择排序优化:\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 5);
	SeqListPushBack(&pList, 4);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 0);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 1);
	show(&pList);
	SelectSort_OP(&pList);
	printf ("\n");
}
void test_BinarySearch ()
{
	int ret = 0;
	SeqList pList;
	printf ("二分查找(非递归):\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 4);
	SeqListPushBack(&pList, 5);
	SeqListPushBack(&pList, 6);
	show (&pList);
	ret = BinarySearch (&pList, 3);
	if (ret != -1)
	{
		printf ("下标是:%d\n", ret);
	}
	printf ("\n");
}

void test_BinarySearch_R()
{
	int ret = 0;
	SeqList pList;
	printf ("二分查找(递归):\n");
	SeqListInit (&pList);
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 2);
	SeqListPushBack(&pList, 3);
	SeqListPushBack(&pList, 4);
	SeqListPushBack(&pList, 5);
	SeqListPushBack(&pList, 6);
	show (&pList);
	ret = BinarySearch_R (&pList, 0, pList.sz-1, 3);
	if (ret != -1)
	{
		printf ("下标是:%d\n", ret);
	}
	printf ("\n");
}

void test_Empty()
{
	int ret = 0;
	SeqList pList;
	SeqListInit (&pList);
	SeqListPushBack(&pList, 1);
	SeqListPushBack(&pList, 2);
	ret = Empty (&pList);
	if (!ret)
	{
		printf ("顺序表非空\n");
	}
	else 
	{
		printf ("顺序表为空\n");
	}
	SeqListPopFront(&pList);
	SeqListPopFront(&pList);
	ret = Empty (&pList);
	if (!ret)
	{
		printf ("顺序表非空\n");
	}
	else 
	{
		printf ("顺序表为空\n");
	}


}

int main()
{

	test_SeqListPushBack ();
	test_SeqListPopBack ();
	test_PushFront();
	teat_SeqListPopFront();
	teat_SeqLIstInsert ();
	test_SeqLIstErase();
	test_SeqListRemove();
	test_SeqListRemoveAll();
	test_SeqListFind ();
	test_SeqListsz();
	test_Bubblesort ();
	test_SelectSort();
	test_SelectSort_OP();
	test_BinarySearch ();
	test_BinarySearch_R();
	test_Empty();
	system ("pause");
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值