1. 程式人生 > >順序表(動態)

順序表(動態)

程式碼:

SeqListD.h

#pragma once


#include "stdio.h"
#include "stdlib.h"
#include "assert.h"

typedef int DataType;

typedef struct SeqListD
{
	DataType* data;
	int sz;
	int capicity;
}SeqListD,*pSeqListD;




void InitSeqListD(pSeqListD ps);//

void DestroySeqListD(pSeqListD ps);//

void PushBack(pSeqListD ps, DataType d);//

void PrintSeqListD(const pSeqListD ps);//

void PopBack(pSeqListD ps);//

void PushFront(pSeqListD ps, DataType d);//

void PopFront(pSeqListD ps);//

void Insert(pSeqListD ps, int pos, DataType d);//

void Erase(pSeqListD ps, int pos);//

void Sort(pSeqListD ps);//

int BinarySearch(pSeqListD ps, DataType d);//

int Find(pSeqListD ps, DataType d);//

void Remove(pSeqListD ps, DataType d);//

void RemoveAll(pSeqListD ps, DataType d);//


SeqListD.c

#define _CRT_SECURE_NO_DEPRECATE 1

#include "SeqListD.h"

void InitSeqListD(pSeqListD ps)
{
	assert(ps);
	ps->data= (DataType*)calloc(5, sizeof(DataType));
	ps->sz = 0;
	ps->capicity = 3;
}


void DestroySeqListD(pSeqListD ps)
{
	assert(ps);
	free(ps->data);
	ps->capicity = 0;
	ps->sz = 0;
}


void ExpandCapicity(pSeqListD ps)
{
	assert(ps != NULL);
	if (ps->sz<ps->capicity)
	{
		return;
	}
	else
	{
		DataType* tmp = NULL;
		tmp = (DataType*)realloc(ps->data, (ps->capicity + 5)*sizeof(DataType));
		if (tmp == NULL)
		{
			return;//擴容失敗
		}
		else
		{
			ps->data = tmp;
			ps->capicity += 5;
		}
	}
	
}



void PushBack(pSeqListD ps, DataType d)
{
	assert(ps!=NULL);

	ExpandCapicity(ps);
	ps->data[ps->sz++] = d;
}


void PrintSeqListD(pSeqListD ps)
{
	assert(ps);
	for (int i = 0; i < ps->sz;i++)
	{
		printf("%d ", ps->data[i]);
	}
	printf("\n");
}


void PushFront(pSeqListD ps, DataType d)
{
	assert(ps);
	
	ExpandCapicity(ps);
	
	for (int i = ps->sz-1; i >= 0;i--)
	{
		ps->data[i+1]  = ps->data[i];
	}
	ps->data[0] = d;
	ps->sz++;
}


void Insert(pSeqListD ps, int pos, DataType d)
{
	assert(ps);

	ExpandCapicity(ps);

	for (int i = ps->sz - 1; i >= pos;i--)
	{
		ps->data[i + 1] = ps->data[i];
	}
	ps->data[pos] = d;
	ps->sz++;
}


void PopBack(pSeqListD ps)
{
	assert(ps);
	assert(ps->sz > 0);

	ps->sz--;
}


void PopFront(pSeqListD ps)
{
	assert(ps);
	assert(ps->sz > 0);

	for (int i = 0; i < ps->sz - 1; i++)
	{
		ps->data[i] = ps->data[i + 1];
	}
	ps->sz--;
}


void Erase(pSeqListD ps, int pos)
{
	assert(ps);
	assert(ps->sz > 0);
	assert(pos >= 0 && pos < ps->sz);

	for (int i = pos; i < ps->sz - 1; i++)
	{
		ps->data[i] = ps->data[i + 1];
	}

	ps->sz--;
}



void Swap(DataType * x, DataType* y)
{
	DataType tmp = *x;
	*x = *y;
	*y = tmp;
}

void Sort(pSeqListD ps)
{
	int i, j;
	int  flag = 1;
	for (i = 0; i < ps->sz - 1; i++)
	{
		flag = 1;	// 假設有序
		for (j = 0; j < ps->sz - 1 - i; j++)
		{
			if (ps->data[j] > ps->data[j + 1])
			{
				Swap(ps->data + j, ps->data + j + 1);
				flag = 0;
			}
		}

		// 一次冒泡過程中,一次交換都沒有,所以已經有序了
		if (1 == flag)
		{
			break;
		}
	}
}


int BinarySearch(pSeqListD ps, DataType d)
{
	assert(ps);
	int left = 0;
	int right = ps->sz - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (d<ps->data[mid])
		{
			right = mid - 1;
		}
		else if (d>ps->data[mid])
		{
			left = mid + 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;
}


int Find(pSeqListD ps, DataType d)
{
	assert(ps);

	for (int i = 0; i < ps->sz; i++)
	{
		if (ps->data[i] == d)
		{
			return i;
		}
	}
	return -1;
}


void Remove(pSeqListD ps, DataType d)
{
	assert(ps);

	int pos = Find(ps, d);
	if (pos == -1)
	{
		return;
	}
	Erase(ps, pos);
}


void RemoveAll(pSeqListD ps, DataType d)
{
	assert(ps);
#if 0

	//建立個數組,把不等於d的資料copy到extra
	DataType *extra = (DataType *)malloc(sizeof(DataType)*ps->sz);
	int i = 0; int j = 0;
	for (int i = 0; i < ps->sz; i++)
	{
		if (ps->data[i] != d)
		{
			extra[j++] = ps->data[i];
		}
	}
	//把extra的資料copy回來
	for (int k = 0; k < j; k++)
	{
		ps->data[k] = extra[k];
	}
	ps->sz = j;
	free(extra);
#endif
	int i = 0; int j = 0;
	for (; i < ps->sz; i++)
	{
		if (ps->data[i] != d)
		{
			ps->data[j++] = ps->data[i];
		}
	}
	ps->sz = j;

}


test.c

#define _CRT_SECURE_NO_DEPRECATE 1

#include "SeqListD.h"
SeqListD seq;




//增
void TestPushSeqListD()
{
	InitSeqListD(&seq);
	//尾插
	PushBack(&seq, 1);
	PushBack(&seq, 2);
	PushBack(&seq, 3);
	PushBack(&seq, 4);
	PushBack(&seq, 5);
	PushBack(&seq, 6);
	PrintSeqListD(&seq);
	//頭插
	InitSeqListD(&seq);
	PushFront(&seq, 1);
	PushFront(&seq, 2);
	PushFront(&seq, 3);
	PushFront(&seq, 4);
	PushFront(&seq, 5);
	PushFront(&seq, 6);
	PrintSeqListD(&seq);
	//指定位置插入
	Insert(&seq, 2, 10);
	PrintSeqListD(&seq);
}


void TestPopSeqListD()
{
	InitSeqListD(&seq);
	//尾插
	PushBack(&seq, 1);
	PushBack(&seq, 2);
	PushBack(&seq, 3);
	PushBack(&seq, 4);
	PushBack(&seq, 5);
	PushBack(&seq, 6);
	PrintSeqListD(&seq);
	//尾刪
	PopBack(&seq);
	PrintSeqListD(&seq);
	//頭刪
	PopFront(&seq);
	PrintSeqListD(&seq);
	//指定位置刪除
	Erase(&seq, 2);
	PrintSeqListD(&seq);
}



void TestSort()
{
	InitSeqListD(&seq);
	//尾插
	PushBack(&seq, 1);
	PushBack(&seq, 3);
	PushBack(&seq, 2);
	PushBack(&seq, 4);
	PushBack(&seq, 5);
	PushBack(&seq, 6);
	Sort(&seq);
	PrintSeqListD(&seq);
}


void TestBinarySearch()
{
	InitSeqListD(&seq);
	//尾插
	PushBack(&seq, 1);
	PushBack(&seq, 2);
	PushBack(&seq, 3);
	PushBack(&seq, 4);
	PushBack(&seq, 5);
	PushBack(&seq, 6);
	PrintSeqListD(&seq);
	int ret=BinarySearch(&seq, 6);
	if (ret==-1)
	{
		return;
	}
	else
	{
		printf("%d\n", ret);
	}
}


void TestFind()
{
	int ret = 0;

	InitSeqListD(&seq);
	PushBack(&seq, 1);
	PushBack(&seq, 2);
	PushBack(&seq, 3);
	PushBack(&seq, 4);

	ret = Find(&seq, 2);

	if (ret == -1)
		printf("資料不存在\n");

	else
		printf("%d\n", ret);
}

void TestRemove()
{
	InitSeqListD(&seq);
	PushBack(&seq, 1);
	PushBack(&seq, 2);
	PushBack(&seq, 1);
	PushBack(&seq, 4);

	Remove(&seq, 1);
	PrintSeqListD(&seq);
}


void TestRemoveAll()
{
	InitSeqListD(&seq);
	PushBack(&seq, 1);
	PushBack(&seq, 2);
	PushBack(&seq, 1);
	PushBack(&seq, 4);

	RemoveAll(&seq, 1);
	PrintSeqListD(&seq);
}


int main()
{
	TestPushSeqListD();
	TestPopSeqListD();
	TestSort();
	TestBinarySearch();
	TestFind();
	TestRemove();
	TestRemoveAll();

	return 0;
}

我的另一篇部落格: