顺序表的简单操作

这次对顺序表进行一些简单的操作,比如插入(头插法,尾插法)删除(头删法,尾删法)查找 ,排序,打印进一步了解顺序表。

SeqList.h

 
 
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _AAA_
#define AAA 

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

#define NUMBER 10
#define Datatype int

typedef struct student
{
	Datatype data[NUMBER];//数据
	int sz;//存放数据的个数
}student, *men;

//初始化 
void InitSeqList(men pSeq); 
//尾部插入 
void PushBack(men pSeq); 
//尾部删除 
void PopBack(men pSeq); 
//头部插入 
void PushFront(men pSeq); 
//头部删除 
void PopFront(men pSeq); 
//查找指定元素 
int Find(men pSeq, Datatype data); 
//指定位置插入 
void Insert(men pSeq, int pos, Datatype data); 
//删除指定位置元素 
void Erase(men pSeq, int pos); 
//删除指定元素 
void Remove(men pSeq, Datatype data); 
//删除所有的指定元素 
void RemoveALL(men pSeq, Datatype data); 
//返回顺序表的大小 
int Size(men pSeq); 
//判断顺序表是否为空 
int Empty(men pSeq); 
//冒泡排序 
void BubbleSort(men pSeq); 
//选择排序 
void SelectSort(men pSeq);
//选择排序的优化 
void SelectSortOP(men pSeq); 
//二分查找 
int BinarySearch(men pSeq, Datatype data); 
//二分查找递归写法 
int BinarySearch_R(men pSeq, int left, int right, Datatype d); 

//打印 
void PrintSeqList(men pSeq); 

#endif//AAA



源.c
#include"SeqList.h"

//*************初始化**********
void InitSeqList(men pSeq)
{
	assert(pSeq != NULL);
	pSeq->sz = 0;
	memset(pSeq->data, 0, sizeof(pSeq->data));
}

//**********打印*************
void PrintSeqList(men pSeq)
{
	int i = 0;
	for(i = 0; i < pSeq->sz; i++)
	{
		printf("%d	", pSeq->data[i] );
	}
	printf("\n");
}
//**************尾插法**********
void PushBack(men pSeq)
{
	int i = 0;
	int j = 0;
	int number = 0;
	assert(pSeq);
	if(pSeq->sz == NUMBER)
	{
		printf("顺序表已满\n");
		return ;
	}
	printf("请输入你要输入的数据的个数:");
	scanf("%d", &number );
	if(number > NUMBER - pSeq->sz)
	{
		printf("没有那么多的元素\n");
		return ;
	}
	for(i = 0; i < number; i++)
	{
		printf("请输入你要输入的元素");
		scanf("%d", &j);
		pSeq->data[i] = j;
		pSeq->sz++;
	}
}

//************尾部删除法************
void PopBack(men pSeq)
{
	int i = 0;
	assert(pSeq);
	if(pSeq->sz == 0)
	{
		printf("顺序表已空\n");
		return ;
	}
	printf("一次要删除的元素的个数:");
	scanf("%d", &i);
	if(i > pSeq->sz)
	{
		printf("没有那么多的元素\n");
		return ;
	}
	pSeq->sz = pSeq->sz - i;//改变他记录的元素个数即可。
}

void PushFront(men pSeq)//头插法
{
	int i = 0;
	int j = 0;
	int number = 0;
	int value = 0;
	assert(pSeq);
	if(pSeq->sz == NUMBER)
	{
		printf("顺序表已满\n");
		return ;
	}
	printf("请输入要插入的元素的个数:");
	scanf("%d", &number);
	if(number > NUMBER - pSeq->sz)
	{
		printf("没有那么多的元素\n");
		return ;
	}
	for(j = 0; j < number; j++)
	{
		for(i = pSeq->sz; i > 0; i--)
		{
			pSeq->data[i] = pSeq->data[i-1]; 
		}
		printf("请输入要插入的元素\n");
		scanf("%d", &value);
		pSeq->data[0] = value;
		pSeq->sz++;
	}
}

//************头删法***********
void PopFront(men pSeq)
{
	int i = 0;
	int j = 0;
	int number = 0;
	int value = 0;
	assert(pSeq);
	if(pSeq->sz == 0)
	{
		printf("顺序表已空\n");
		return ;
	}
	printf("请输入要删除的元素的个数:");
	scanf("%d", &number);
	if(number > pSeq->sz)
	{
		printf("没有那么多的元素\n");
		return ;
	}
	for(j = 0; j < number; j++)
	{
		for(i = 0; i < pSeq->sz-1; i++)
		{
			pSeq->data[i] = pSeq->data[i+1]; 
		}
		pSeq->sz--;
	}
}

//*********查找*********
int Find(men pSeq, Datatype data)
{
	int i = 0;
	assert(pSeq);
	for(i = 0; i < pSeq->sz; i++)
	{
		if(pSeq->data[i] == data)
			return i;
	}
	return -1;
}

//*********指定位置插入**********
void Insert(men pSeq, int pos, Datatype data)
{
	int i = 0;
	assert(pSeq&& pos >= 0 && pos < NUMBER);
	if(pSeq->sz == NUMBER)
	{
		printf("顺序表已满\n");
		return ;
	}
	for(i = pSeq->sz; i > pos; i--)
	{
		pSeq->data[i] = pSeq->data[i-1];
	}
	pSeq->sz++;
	pSeq->data[pos] = data;
}
//**********删除指定位置元素************ 
void Erase(men pSeq, int pos)
{
	int i = 0;
	assert(pSeq && pos >= 0 && pos < NUMBER);
	for(i = pos; i < pSeq->sz-1 ;i++)
	{
		pSeq->data[i] = pSeq->data[i+1];
	}
	pSeq->sz--;
}
//************删除指定元素*********** 
void Remove(men pSeq, Datatype data)
{
	int i = 0;
	int j = 0;
	assert(pSeq);
	for(i = 0; i < pSeq->sz ;i++)
	{
		if(pSeq->data[i] ==data)
		{
			for(j = i;  j < pSeq->sz-1; j++)
			{
				pSeq->data[j] = pSeq->data[j+1];
			}
			pSeq->sz--;
			return ;
		}

	}
	pSeq->sz--;
}
//***********删除所有的指定元素 ************
void RemoveALL(men pSeq, Datatype data)
{
	int i = 0;
	int j = 0;
	assert(pSeq);
	for(i = 0; i < pSeq->sz; i++)
	{
		if(pSeq->data[i] != data)
		{
			pSeq->data[j] = pSeq->data[i];
			j++;
		}
	}
	pSeq->sz = j;
}

//********返回顺序表的大小************ 
int Size(men pSeq)
{
	return (pSeq->sz);
}
//*******判断顺序表是否为空**********
int Empty(men pSeq)
{
	return (pSeq->sz == 0 ? 0 : 1);
}

//**********冒泡排序*********** 
void BubbleSort(men pSeq)
{
	int i = 0;
	int j = 0;
	int flag = 0;
	assert(pSeq);
	for(i = 0; i < pSeq->sz-1; i++)
	{
		flag = 0;  //记录状态,如果已经有序就不再便利下去
		for(j = 0; j < pSeq->sz - 1 - i; j++)
		{
			if(pSeq->data[j] > pSeq->data[j+1])
			{
				Datatype tmp = pSeq->data[j];
				pSeq->data[j] = pSeq->data[j+1];
				pSeq->data[j+1] = tmp;
				flag = 1;
			}
		}
		if(0 == flag)//如果有序就退出循环
			break;
	}
}

//*************二分查找*********** 
int BinarySearch(men pSeq, Datatype data)
{
	int left = 0;
	int right = pSeq->sz -1;
	int mid = 0;
	while(left <= right)
	{
		mid = left + (right - left)/2;
		if(pSeq->data[mid] > data)
			right = mid - 1;
		else if(pSeq->data[mid] < data)
			left = mid + 1;
		else
			return mid;
	}
	return -1;//没找到时返回-1
}

//**********二分查找递归写法*********** 
int BinarySearch_R(men pSeq, int left, int right, Datatype data)
{
	int mid = left + (left+right)/2;
	if(left > right)//没找到的情况
		return -1;
	else if(pSeq->data[mid] > data)
		return BinarySearch_R(pSeq, left, mid-1,  data);
	else if(pSeq->data[mid] < data)
		return BinarySearch_R(pSeq, mid+1, right,  data);
	else              //找到的情况
		return mid;
}
//***********选择排序************** 
void SelectSort(men pSeq)
{
	int i = 0;
	int j = 0;
	int ret = 0;
	int tmp = pSeq->data[0];
	for(i = 0; i < pSeq->sz-1; i++)
	{
		tmp = pSeq->data[i];
		for(j = i; j < pSeq->sz; j++)
		{
			if(pSeq->data[j] < tmp)
			{
				tmp = pSeq->data[j];
				ret = j;
			}
		}
		pSeq->data[ret] = pSeq->data[i];
		pSeq->data[i] = tmp;
	}
}
//选择排序的优化
void SelectSortOP(men pSeq)//一次找出最大值和最小值
{
	int i = 0;
	int j = 0;
	for(i = 0; i < (pSeq->sz)/2; i++)
	{
		int maxpos = i;//记录每次便利中最大数的下标
		int minpos = i;//记录每次便利中最小数的下标
		for(j = i+1; j < pSeq->sz-i; j++)
		{
			if(pSeq->data[j] > pSeq->data[maxpos])
			{
				maxpos = j;
			}
			if(pSeq->data[j] < pSeq->data[minpos])
			{
				minpos = j;
			}
		}
		if(maxpos != pSeq->sz-1-i)//如果最大的数的位置正是你要放的位置就不变
		{
			Datatype tmp = pSeq->data[pSeq->sz-1-i];
			pSeq->data[pSeq->sz-1-i] = pSeq->data[maxpos];
			pSeq->data[maxpos] = tmp;
		}
		if(minpos == pSeq->-1-i)//防止特殊情况(比如:4 3 2 1这种情况下,上面已经交换过一次,如果下面在交换一次的话相当于没变)
		{
			minpos = maxpos;
		}
		if(minpos != i)//如果最小的数的位置正是你要放的位置就不变
		{
			Datatype tmp = pSeq->data[i];
			pSeq->data[i] = pSeq->data[minpos];
			pSeq->data[minpos] = tmp;
		}
	}
}

主函数.c

#include"SeqList.h"

void Text()
{
	int data = 0;
	int i = 0;
	int pos = 0;
	student pSeq;
//初始化
	InitSeqList(&pSeq); 
//尾插法
	PushBack(&pSeq);
	PrintSeqList(&pSeq);
//尾部删除
	PopBack(&pSeq);
	PrintSeqList(&pSeq);
//头部插入
	PushFront(&pSeq);
	PrintSeqList(&pSeq);
//头部删除
	PopFront(&pSeq);
	PrintSeqList(&pSeq);
//查找
	printf("请输入要查找的元素为:");
	scanf("%d", &data);
	i =Find(&pSeq, data);
	if(i == -1)
		printf("找不到\n");
	else
		printf("下标为:%d\n", i);
	PrintSeqList(&pSeq);

//指定位置插入
	printf("请输入要插入的下标和元素为:");
	scanf("%d%d", &pos,&data);
	Insert(&pSeq, pos, data);
	PrintSeqList(&pSeq);

//删除指定位置元素 
	printf("请输入要删除的元素的下标:");
	scanf("%d", &pos);
	Erase(&pSeq, pos);
	PrintSeqList(&pSeq);

//**********删除指定元素************
	printf("请输入要删除的元素为:");
	scanf("%d", &data);
	Remove(&pSeq, data);
	PrintSeqList(&pSeq);

//*********删除所有的指定元素******** 
	printf("请输入要删除的元素为:");
	scanf("%d", &data);
	RemoveALL(&pSeq, data);
	PrintSeqList(&pSeq);

//********返回顺序表的大小********** 
    i = Size(&pSeq); 
	printf("顺序表的大小为%d\n", i);

//判断顺序表是否为空 
    i = Empty(&pSeq); 
	if(i == 0)
		printf("顺序表为空\n");
	else
		printf("顺序表不为空\n");
//冒泡排序
	 printf("冒泡排序为\n");
     BubbleSort(&pSeq); 
	 PrintSeqList(&pSeq);
//二分查找 
	printf("请输入要查找的元素为:");
	scanf("%d", &data);	
	BinarySearch( &pSeq, data);
	i = BinarySearch(&pSeq, data);
	if(i == -1)
		printf("找不到\n");
	else
		printf("下标为:%d\n", i);
	PrintSeqList(&pSeq);
//二分查找递归写法 
	printf("请输入要查找的元素为:");
	scanf("%d", &data);	
	i = BinarySearch_R(&pSeq, 0, pSeq.sz-1, data);
	if(i == -1)
		printf("找不到\n");
	else
		printf("下标为:%d\n", i);
	PrintSeqList(&pSeq);
//选择排序 
	printf("选择排序为:\n");
	SelectSort(&pSeq); 
	PrintSeqList(&pSeq);
//选择排序的优化 
	printf("优化后选择排序为:\n");
	SelectSortOP(&pSeq);
	PrintSeqList(&pSeq);
}

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


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值