C語言實現順序表--靜態

///////////////////////////C語言實現靜態順序表///////////////////////
#include<stdio.h>
#include<assert.h>

#define MaxSize 5
typedef int DataType;

typedef struct SeqList
{
	DataType arr[MaxSize];
	size_t size;
}SeqList,*pSeqList;

void InitSeqList(SeqList* seq)//初始化
{
	assert(seq);
	printf("%x\n",&seq);
	memset(seq->arr,0,sizeof(seq->arr));
	seq->size = 0;
}
void PrintSeqList(SeqList* seq)//打印
{
	int i = 0;
	for(; i < seq->size; i++)
	{
		printf("%d ",seq->arr[i]);
	}
	printf("\n");
}
void Reverse(SeqList* seq, int left, int right)//遞歸逆序打印順序表
{
	if(left < right)
	{
		int temp;
		temp = seq->arr[right];
		seq->arr[right] = seq->arr[left];
		seq->arr[left] = temp;
		Reverse(seq, left+1, right-1);
	}
}
void PushBack(SeqList* seq, DataType data)//尾插
{
	assert(seq);
	if(seq->size >= MaxSize)
		return;
	seq->arr[seq->size++] = data;
}
void PopBack(SeqList* seq)//尾刪
{
	assert(seq);
	if(seq->size == 0)
		return;
	seq->size--;
}
void PushFront(SeqList* seq, DataType data)//頭插
{
	int idx = 0;
	for(idx = seq->size-1; idx >= 0; idx--)
	{
		seq->arr[idx+1] = seq->arr[idx];
	}
	seq->arr[0] = data;
	seq->size++;
}
void PopFront(SeqList* seq)//頭刪
{
	int idx = 0;
	assert(seq);
	for(idx = 0; idx < seq->size-1; idx++)
	{
		seq->arr[idx] = seq->arr[idx+1];
	}
	seq->size--;
}
void Insert(SeqList* seq, size_t pos, DataType data)//任意位置插入
{
	int idx = seq->size;//可能尾插
	if(NULL == seq || pos > seq->size)//鏈表爲空pos位置大於size都不合法
		return;
	if(seq->size >= MaxSize)//插入後元素個數大於容量
		return;
	for(; idx >= pos; idx--)
	{
		seq->arr[idx] = seq->arr[idx+1];
	}
	seq->arr[pos] = data;
	seq->size++;
}
void Erase(SeqList* seq, size_t pos)//任意位置刪除
{
	int idx = pos;
	if(NULL == seq || pos >= seq->size || seq->size == 0)//如果鏈表爲空或刪除位置不合法或鏈表元素爲0
		return;
	
	for(;idx < seq->size; idx++)
	{
		seq->arr[idx] = seq->arr[idx+1];
	}
	seq->size--;
}
int Find(SeqList* seq, DataType data)//查找某個元素位置
{
	int idx = 0;
	assert(seq);
	for(;idx < seq->size; idx++)
	{
		if(seq->arr[idx] == data)
			return idx;
	}
	return -1;
}
int BinarySearch(SeqList* seq, int key, int left, int right)
{
	int mid;
	//left = 0;
	//right = seq->size-1;
	//assert(seq);
	if(left <= right){//左邊要小於右邊
	mid = left + (right-left)/2;
	if(seq->arr[mid] == key)
		return mid;
	else if(seq->arr[mid] < key)
		return BinarySearch(seq, key, mid+1, right);
	else /*if((seq->arr[mid] > key))*/
	{
		return BinarySearch(seq, key, left, mid-1);
	}
	}
	else{
		return -1;}
}
void Remove(SeqList* seq, DataType data)//刪除值爲data的元素
{
	assert(seq);
	Erase(seq, Find(seq, data));
}
void RemoveAll(SeqList* seq, DataType data)//刪除所有值爲data的元素
{
	int count = 0;
	int idx = 0;
	//assert(seq);
	while(idx < seq->size)
	{
		if(seq->arr[idx] = data)
		{
			count++;
		}
		else
		{
			seq->arr[idx-count] = seq->arr[idx];
		}
		idx++;
	}
	seq->size -= count;
}
void BubbleSort(SeqList* seq)//冒泡排序
{
	int i = 0;
	int j = 0;
	int flag = 0;
	assert(seq);
	for(i = 0; i < seq->size-1; i++)
	{
		flag = 0;
		for(j = 0; j < seq->size-1-i; j++)
		{
			if(seq->arr[j] > seq->arr[j+1])
			{
				DataType temp;
				temp = seq->arr[j+1];
				seq->arr[j+1] = seq->arr[j];
				seq->arr[j] = temp;
				flag = 1;
			}
		}
		if(flag == 0)
			return;
	}
}

void FunTest()
{
	SeqList seq;
	int pos = 0;
	InitSeqList(&seq);
	//PrintSeqList(&seq);
	PushBack(&seq, 2);
	PushBack(&seq, 3);
	PushBack(&seq, 4);
	PushBack(&seq, 5);
	PushFront(&seq, 1);
	//Insert(&seq, 3, 3);
	PrintSeqList(&seq);
	Reverse(&seq, 0, 4);

	//BubbleSort(&seq);
	//pos = BinarySearch(&seq, 4, 0, 4);
	//RemoveAll(&seq, 4);
	PrintSeqList(&seq);//////////////有問題

	////PopFront(&seq);
	//pos = Find(&seq, 4);
	//printf("%d\n",pos);

	//Remove(&seq, 4);
	
	////printf("%d\n",seq.size);
}
int main()
{
	FunTest();
	system("pause");
	return 0;
}


發佈了62 篇原創文章 · 獲贊 14 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章