静态顺序表的实现

head.h

#pragma once

#include<string.h>
#include<stdio.h>
#define MAX_SIZE 10 
typedef unsigned int size_t; 
typedef int DataType; 

typedef struct SeqList 
{ 
	DataType _array[MAX_SIZE]; 
	int  _size; // 顺序表中有效元素的个数 
}SeqList, *PSeqList; 

//typedef struct SeqList SeqList; 

/// 
// .h 
// 初始化顺序表 
void SeqListInit(PSeqList ps); 

// 尾插 
void SeqListPushBack(PSeqList ps, DataType data); 

// 尾删 
void SeqListPopBack(PSeqList ps); 

// 头插 
void SeqListPushFront(PSeqList ps, DataType data); 

// 头删 
void SeqListPopFront(PSeqList ps); 

// 任意位置中插入值为data的元素 
void SeqListInsert(PSeqList ps, int  pos, DataType data); 

// 删除任意位置中的元素 
void SeqListErase(PSeqList ps, int pos); 

// 在顺序表中查找值为data的元素,返回该元素在顺序表中的下标 
int SeqListFind(PSeqList ps, DataType data); 

// 删除顺序表中值为data的元素 
void SeqListRemove(PSeqList ps, DataType data); 

// 删除顺序表中所有值为data的元素 
void SeqListRemoveAll(PSeqList ps, DataType data); 

// 判断顺序表是否为空 
int SeqListEmpty(PSeqList ps); 

// 获取顺序表中元素的个数 
int SeqListSize(PSeqList ps); 

/ 
// 辅助操作 
// 打印顺序表中的元素 
void PrintSeqList(PSeqList ps); 

// 用冒泡排序对顺序表中的元素进行排序 
void BubbleSort(int* array, int size); 

// 用选择排序对顺序表中的元素进行排序 
void SelectSort(int* array, int size); 

// 选择排序优化---一次找出最大最小元素所在的位置 
void SelectSort_OP(int* array, int size); 

head.c

#include "head.h"

void swap(int* arr1,int* arr2);  //交换函数声明
//初始化顺序表
void SeqListInit(PSeqList ps)
{
	int i=0;
	if (NULL==ps)
		return;
    memset(ps->_array,0,sizeof(DataType)*MAX_SIZE);
    ps->_size=0;
}

// 尾插 
void SeqListPushBack(PSeqList ps, DataType data)
{
	if(NULL==ps)
		return;
	if (ps->_size==MAX_SIZE)
		return;
	else 
	{
	  ps->_array[ps->_size]=data;
	  ps->_size++;
	}  
}

// 尾删 
void SeqListPopBack(PSeqList ps)
{
	if(NULL==ps)
		return;
	if (0==ps->_size)
	    return;
	else
	{	
		ps->_array[ps->_size-1]=0;

		ps->_size--;
	}
}

// 头插 
void SeqListPushFront(PSeqList ps, DataType data)
{
	int i=ps->_size-1;
	if(NULL==ps)
       return;
    if(ps->_size==MAX_SIZE)
		return;
    for (;i>=0;i--)
    {
		ps->_array[i+1]=ps->_array[i];
    }
	ps->_array[0]=data;
	ps->_size++;
}

// 头删 
void SeqListPopFront(PSeqList ps)
{
	int i=0;
	if(NULL==ps)
		return;
    for (;i<ps->_size-1;i++)
    {
		ps->_array[i]=ps->_array[i+1];
    }
	ps->_array[ps->_size-1]=0;
	ps->_size--;
}
// 任意位置中插入值为data的元素 
void SeqListInsert(PSeqList ps, int pos, DataType data)
{
	int i=0;
	if(NULL==ps)
		return;
    if(pos>=ps->_size||(ps->_size)==MAX_SIZE)
		return;
    for (i=ps->_size-1;i>=pos;i--)
    {
	   ps->_array[i+1]=ps->_array[i];
	}
	ps->_array[pos]=data;
	ps->_size++;
}

// 删除任意位置中的元素 
void SeqListErase(PSeqList ps, int pos)
{
	int i=0;
	if(NULL==ps)
       return;
	if (0==ps->_size||pos>=ps->_size)
        return;
    for (i=pos;i<ps->_size-1;i++)
    {
		ps->_array[i]=ps->_array[i+1];
    }
	ps->_array[ps->_size-1]=0;
	ps->_size--;
}

// 在顺序表中查找值为data的元素,返回该元素在顺序表中的下标 
int SeqListFind(PSeqList ps, DataType data)
{
	int i=0;
	if(NULL==ps)
		return 0;
    for (i=0;i<ps->_size;i++)
    {
        if(ps->_array[i]==data) 
			return i;
	}
	return 0;
}

// 删除顺序表中值为data的元素 
void SeqListRemove(PSeqList ps, DataType data)
{
	int i=0;
	if(NULL==ps)
		return;
    for(;i<ps->_size;i++)
	{
		if(ps->_array[i]==data)
		{	
			SeqListErase(ps,i);   
	        break;
		}
	}
}

// 删除顺序表中所有值为data的元素 
void SeqListRemoveAll(PSeqList ps, DataType data)
{
	int i=0;
	if(NULL==ps)
		return;
	while(i<ps->_size)
	{
		if(ps->_array[i]==data)
		{
			SeqListErase(ps,i);
			continue;
		}
		i++;
	}
}

// 判断顺序表是否为空 
int SeqListEmpty(PSeqList ps)
{
	if(NULL==ps)
		return 1;
	return 0;
}

// 获取顺序表中元素的个数 
int  SeqListSize(PSeqList ps)
{
	if(NULL==ps)
	{
		printf("元素表为空!\n");
		return 0;
	}
		return ps->_size;
}

/ 
// 辅助操作 
// 打印顺序表中的元素 
void PrintSeqList(PSeqList ps)
{
	int i=0;
	if(NULL==ps)
		return;
    for (;i<ps->_size;i++)
    {
		printf("%d ",ps->_array[i]);
    }
}

// 用冒泡排序对顺序表中的元素进行排序 
void BubbleSort(int* array, int size)
{
	int i=0;
	int j=0;
	if(0==size)
		return;	
    for(;i<size;i++)
	{
		int tmp=0;
		for (j=0;j<size-i;j++)
		{
           if(array[j]>array[j+1])
		   {
			   tmp=array[j];
			   array[j]=array[j+1];
			   array[j+1]=tmp;
		   }
		} 
	}
}

// 用选择排序对顺序表中的元素进行排序 
void SelectSort(int* array, int size)
{
	int i=0;
	int j=0;
	int maxpos=0;  
	int tmp=0;
	if(0==size)
		return;

	for(i=0;i<size;++i)  
	{  
		maxpos=size-i; 
		tmp=0;
		for(j=0;j<size-i;++j)  
		{  
			if(array[j]>array[maxpos])  
				maxpos=j;  
		}  
		if(maxpos!=size-i)  
		   swap(&array[maxpos],&array[j]);
	}  
}


// 选择排序优化---一次找出最大最小元素所在的位置 
void SelectSort_OP(int* array, int size)
{
	int i=0;
	int j=0;
	int maxpos=0;	
	int minpos=0;
	int begin=0;
	int end=size-1; 
	if(0==size)
		return;

	while (begin<end)
	{
		begin=i;
		end=size-1-i;
		minpos=i;
		maxpos=size-1-i; 
		
		for(j=i;j<size-i;++j)  
		{  
			if(array[j]>array[maxpos])  
				maxpos=j; 
			if (array[j]<array[minpos])
				minpos=j;
		}  
		if(maxpos!=end) 
		{
			swap(&array[maxpos],&array[end]);
		    if(minpos==end)
				minpos=maxpos;
		}
			if(minpos!=begin)  
			swap(&array[minpos],&array[begin]);
		i++;
	}

}

void swap(int* arr1,int* arr2)
{
	int tmp=*arr1;
	*arr1=*arr2;
	*arr2=tmp;
} 

test.c

#define _CRT_SECURE_NO_WARNINGS 
#include "head.h"
void test()
{
	SeqList s;

	SeqListInit(&s);
	SeqListPushBack(&s,9);       //尾插
	SeqListPushBack(&s,8); 
	SeqListPushBack(&s,7);
	SeqListPushBack(&s,6);
	SeqListPushBack(&s,5);
	SeqListPushBack(&s,4);
	SeqListPushBack(&s,3);
	SeqListPushBack(&s,2);
	SeqListPushBack(&s,1);
	SeqListPushBack(&s,0);
	    
	//SeqListPopBack(&s);       //初始化
    //SeqListPushFront(&s,3);   //头插
	//SeqListPopFront(&s);      //头删
    //SeqListInsert(&s,1,6);    //任意位置插入
    //SeqListErase(&s,3);         //任意位置删除
	//printf("%d\n",SeqListFind(&s,4));   //找元素,并返回下标
	//SeqListRemove(&s,4);      //删除数据为data的元素
	//SeqListRemoveAll(&s,4);      //删除所有数据为data的元素
    //BubbleSort(s._array,s._size);  //冒泡排序
	//SelectSort(s._array,s._size);    //选择排序
   	SelectSort_OP(s._array,s._size); //选择排序优化
} 

int main()
{
    test();
	return 0;
}

在实现选择排序优化函数的时候,遇到点问题:在升序中,如果最小元素处于尾位置,那么在第一次将最大元素放至end位置时,最小元素也会被放至交换前最大元素的位置,所以此时应该把minpos也改变,赋值为maxpos。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值