顺序表(静态)

头文件  SeqList.h

# pragma once
# include "SeqList.h"
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <assert.h>
# define  ARRAYSIZE 100
typedef int  DataType;
typedef struct SeqList
{
	int array[ARRAYSIZE];
	int size;
}SeqList;
// 尾部插入 
void SeqListPushBack(SeqList *p, DataType data);

// 头部插入 
void SeqListPushFront(SeqList *p, DataType data);

// 尾部删除 
void SeqListPopBack(SeqList *p);

// 头部删除 
void SeqListPopFront(SeqList *p);

// 按下标插入,pos 的范围是 [0, size] 
void SeqListInsert(SeqList *p, int pos, DataType data);

// 按下标删除,pos 的范围是 [0, size) 
void SeqListErase(SeqList *p, int pos);

// 按值删除,只删遇到的第一个 
void SeqListRemove(SeqList *p, DataType data);

// 按值删除,删除所有的 
void SeqListRemoveAll(SeqList *p, DataType data);

// 清空 
void SeqListClear(SeqList *p);

// 按值查找,返回第一个找到的下标,如果没找到,返回 -1 
int SeqListFind(SeqList *p, DataType data);

// 判断是否为空,1 表示空, 0 表示不空 
int SeqListEmpty(SeqList *p);

// 返回数量 
int SeqListSize(SeqList *p);

// 销毁 
void SeqListDestroy(SeqList *p);

//快速排序
void SeqListSelectSort(SeqList* p);

//冒泡排序
void SeqListSort(SeqList* p);

//测试
void SeqListText();

//交换
void Swap(DataType *dest, DataType *src);

//显示
void SeqListShow(SeqList* p);

SeqList.c  文件

# include "SeqList.h"

// 交换
void Swap(DataType *dest, DataType *src)
{
	char tmp = 0;
	assert(dest&&src);
	tmp = *dest;
	*dest = *src;
	*src = tmp;
}

//初始化
void SeqListInit(SeqList* p)
{
	memset(p->array, 0, sizeof(DataType)*ARRAYSIZE);
	p->size = 0;
}

// 尾部插入 
void SeqListPushBack(SeqList *p, DataType data)
{
	assert(p != NULL);
	if (p->size == ARRAYSIZE)
	{
		printf("顺序表已满\n");
		return;
	}
	p->array[p->size] = data;
	p->size++;
}

// 头部插入 
void SeqListPushFront(SeqList *p, DataType data)
{
	assert(p != NULL);
	int i = 0;
	if (p->size == ARRAYSIZE)
	{
		printf("顺序表已满\n");
		return;
	}
	for (i = p->size; i >= 0; i--)
	{
		p->array[i] = p->array[i - 1];
	}
	p->array[0] = data;
	p->size++;
}

// 尾部删除 
void SeqListPopBack(SeqList *p)
{
	assert(p != NULL);
	p->size--;
}

// 头部删除 
void SeqListPopFront(SeqList *p)
{
	assert(p != NULL);
	int i = 0;
	for (i = 0; i < p->size - 1; i++)
		p->array[i] = p->array[i + 1];
	p->size--;
}

// 按值查找,返回第一个找到的下标,如果没找到,返回 -1 
int SeqListFind(SeqList *p, DataType data)
{
	int i = 0;
	assert(p);
	for (i = 0; i < p->size; i++)
	{
		if (p->array[i] == data)
			return i;//返回下标
	}
	return -1;//没有找到
}

// 按下标插入,pos 的范围是 [0, size] 
void SeqListInsert(SeqList *p, int pos, DataType data)
{
	assert(p != NULL);
	assert(0<= pos <= p->size);
	int i = 0;
	if (p->size == ARRAYSIZE)
	{
		printf("顺序表已满\n");
		return;
	}
	for (i = p->size; i >= pos; i--)
		p->array[i] = p->array[i - 1];
	p->array[pos-1] = data;
	p->size++;
}
// 按下标删除,pos 的范围是 [0, size) 
void SeqListErase(SeqList *p, int pos)
{
	assert(p != NULL);
	assert(0 <= pos < p->size);
	int i = 0;
	for (i = pos; i < p->size-1; i++)
		p->array[i] = p->array[i + 1];
	p->size--;
}

// 按值删除,只删遇到的第一个 
void SeqListRemove(SeqList *p, DataType data)
{
	int ret= SeqListFind(p, 1);
	if (ret != -1)
	{
		SeqListErase(p, ret);
	}
}

// 按值删除,删除所有的 
void SeqListRemoveAll(SeqList *p, DataType data)
{
	assert(p);
	int i = 0,j=0,count=0;
	for (i = 0; i < p->size; i++)
	{
		if (p->array[i] == data)
			count++;
		else
		{
			p->array[j] = p->array[i];
			j++;
		}
	}
	p->size -= count;
}

// 清空 
void SeqListClear(SeqList *p)
{
	memset(p->array, 0, sizeof(DataType)*ARRAYSIZE);
	p->size = 0;
}

// 销毁 
void SeqListDestroy(SeqList *p)
{
	free(p);
	p->size = 0;
	p = NULL;

}

//冒泡排序
void SeqListSort(SeqList* p)
{
	int end = p->size-1;
	while (end >= 0)
	{
		int i = 0;
		int exchange = 0;
		for (i = 0; i < end; i++)
		{
			if (p->array[i]>p->array[i + 1])
				Swap(&p->array[i], &p->array[i+1]);
			exchange = 1;
		}
		if (exchange = 0)
			break;
		end--;
	}
}

//快速排序
void SeqListSelectSort(SeqList* p)
{
	int left = 0, right = p->size-1;
	int max = 0, min = 0;
	for (; left<right;)
	{
		int i = left;
		for (; i <= right; i++)
		{
			if (p->array[i]>p->array[max])
				max = i;
			if (p->array[i] < p->array[min])
				min = i;
		}
		Swap(&p->array[max], &p->array[right]);
		Swap(&p->array[min], &p->array[left]);
		left++;
		right--;
	}
}

// 判断是否为空,1 表示空, 0 表示不空 
int SeqListEmpty(SeqList *p)
{
	return p->size == 0 ? 1 : 0;
}

// 返回数量 
int SeqListSize(SeqList *p)
{
	return p->size;
}



//显示
void SeqListShow(SeqList* p)
{
	assert(p != NULL);
	int i = 0;
	for (i = 0; i < p->size; i++)
	{
		printf("%d", p->array[i]);
	}
	printf("\n");
}

//测试
void SeqListTest()
{
	SeqList s;
	SeqListInit(&s);
	SeqListPushFront(&s, 1);
	SeqListPushFront(&s, 2);
	SeqListPushFront(&s, 6);
	SeqListPushFront(&s, 1);
	SeqListSelectSort(&s);
	SeqListShow(&s);
	/*SeqListRemoveAll(&s, 1);*/
	SeqListSort(&s);
	/*SeqListRemove(&s, 1);*/
	/*SeqListInsert(&s, 2, 6);*/
	SeqListShow(&s);
	/*SeqListPopFront(&s);
	SeqListShow(&s);
	SeqListShow(&s);
	SeqListErase(&s, 2);
	SeqListShow(&s);
	SeqListPopFront(&s);
	SeqListShow(&s);*/
}


测试文件 test.c

# include "SeqList.h"

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


猜你喜欢

转载自blog.csdn.net/zhangtianqiang1314/article/details/80458303