静(动)态顺序表的实现

静态顺序表和动态顺序表是其他表结构的基础

静态顺序表

SeqList.h

#ifndef __SEQLIST__H__
#define __SEQLIST__H__


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

#define MAX 100 
typedef int DateType;

typedef struct SeqList 
{
	DateType data[MAX];
	int sz;
	
}SeqList,*pSeqList;


void InitSeqlist(pSeqList ps);
void PushBack(pSeqList ps, DateType d);
void PrintSeqist(const pSeqList ps);
void PopBack(pSeqList ps);
void PushFront(pSeqList ps, DateType d);
void PopFront(pSeqList ps);
void Insert(pSeqList ps, int pos, DateType d);
int Find(pSeqList ps, DateType d);
void Remove(pSeqList ps, DateType d);
void ReverseSeqlist(pSeqList ps);
void SortSeqlist(pSeqList ps);
int BinarySearch(pSeqList ps, DateType d);

#endif//__SEQLIST__H__

SeqList.c

#include "SeqList.h"
void InitSeqlist(pSeqList ps)
{
	assert(ps);
	memset(ps->data,0,sizeof(ps->data[0])*MAX);
	ps->sz=0;
	return;
}
void PrintSeqist(const pSeqList ps)
{
	int i = 0;
	for(i=0;i<ps->sz;i++)
	{
		printf("%d ",ps->data[i]);
	}
	printf("\n");
	return;
}
void PushBack(pSeqList ps, DateType d)
{
	assert(ps);
	if(ps->sz==MAX)
	{
		return;
	}
	ps->data[ps->sz]=d;
	ps->sz++;
	return;

}
void PopBack(pSeqList ps)
{
	assert(ps);
	if(ps->sz==0)
	{
		return;
	}
	ps->sz--;
	return;

}
void PushFront(pSeqList ps, DateType d)
{
	int i = 0;
	assert(ps);
	if (ps->sz==MAX)
	{
		return;
	}
	for (i=ps->sz;i>0;i--)//在这种有判断的地方留一个心,可以假设最后那个值,看是否合适
	{
		ps->data[i]=ps->data[i-1];
	}
	ps->data[0]=d;
	ps->sz++;
	
	return;
}
void PopFront(pSeqList ps)
{
	int i = 0;
	assert(ps);
	if (ps->sz==0)
	{
		return;
	}
	for (i=0;i<ps->sz-1;i++)
	{
		ps->data[i]=ps->data[i+1];
	}
	ps->sz--;
	return;
}
void Insert(pSeqList ps, int pos, DateType d)
{
	int i = 0;
	assert(ps);
	if (ps->sz==MAX)
	{
		return;
	}
	for (i=ps->sz;i>pos;i--)
	{
		ps->data[i]=ps->data[i-1];
	}
	ps->data[pos]=d;
	ps->sz++;
	return;
}
int Find(pSeqList ps, DateType d)
{
	int i = 0;
	assert(ps);
	if(ps->sz!=0)
	{
		for (i=0;i<ps->sz;i++)
		{
			if(ps->data[i]==d)
				return i;
		}

	}
	return -1;
}
void Remove(pSeqList ps, DateType d)
{
	int ret = 0;
	int i = 0;
	assert(ps);
	if (ps->sz==0)
	{
		return;
	}
	ret = Find(ps,d);
	if (ret!=-1)
	{
		for (i=ret;i<ps->sz-1;i++)
		{
			ps->data[i]=ps->data[i+1];
		}
		ps->sz--;
	}
	return;
}
void ReverseSeqlist(pSeqList ps)
{
	
	int left = 0;
	int right = ps->sz-1;
	int tmp = 0;
	assert(ps);
	if (ps->sz==0)
	{
		return;
	}
	while(left<right)
	{
		tmp = ps->data[right];
		ps->data[right] = ps->data[left];
		ps->data[left] = tmp;
		left++;
		right--;
	}
	return;

}
void SortSeqlist(pSeqList ps)
{
	int i = 0;
	int j = 0;
	int tmp = 0;
	assert(ps);
	if (ps->sz==0)
	{
		return;
	}
	for (i=0;i<ps->sz-1;i++)
	{
		for (j=0;j<ps->sz-1-i;j++)
		{
			if (ps->data[j]>ps->data[j+1])
			{
				tmp = ps->data[j];
				ps->data[j] = ps->data[j+1];
				ps->data[j+1] = tmp;
			}
		}

	}
	return;
}
int BinarySearch(pSeqList ps, DateType d)
{
	int left = 0;
	int right = ps->sz-1;
	int mid = 0;
	SortSeqlist(ps);
	assert(ps);
	if (ps->sz!=0)
	{
		while (left<=right)//注意是小于等于
		{
			mid = (left+right)/2;
			if (ps->data[mid]==d)
			{
				return mid;
			}
			else if (ps->data[mid]<d)
			{
				left = mid+1;
			}
			else
			{
				right = mid-1;
			}
		}
	}
	return -1;
	
}
test.c

#include "SeqList.h"
void test()
{
	SeqList s;
	int ret = 0;
	InitSeqlist(&s);
	PushBack(&s,1);
	PushBack(&s,3);
	PushBack(&s,2);
	PushBack(&s,4);
	PrintSeqist(&s);
	return;
}
int main()
{
	test();
	return 0;
}

上述功能均测试通过,有兴趣可以自行再测试。

动态顺序表

SeqList_D.h

#ifndef __SEQLIST_D_H__
#define __SEQLIST_D_H__

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

typedef int DataType;



#define DEFALUT_INC 5

typedef struct SeqList
{
	DataType* pdata;//指向数据的存储位置
	int sz;//有效个数
	int capacity;//容量
}SeqList, *pSeqList;


//初始化顺序表
void InitSeqList(pSeqList ps);//初始化表
void DestroySeqList(pSeqList ps);//销毁表
void PushBack(pSeqList ps, DataType d);//在尾部添加
void PrintSeqList(const pSeqList ps);//打印顺序表
void PopBack(pSeqList ps);//删除尾部元素
void PushFront(pSeqList ps, DataType d);//在头部添加
void PopFront(pSeqList ps);//删除头部元素
void Insert(pSeqList ps, int pos, DataType d);//在输入位置前端插入
int Find(pSeqList ps, DataType d);//查找某元素位置
void Remove(pSeqList ps, DataType d);//删除输入的元素
void ReverseSeqlist(pSeqList ps);//逆序顺序表
void SortSeqlist(pSeqList ps);//排序顺序表(冒泡)
int BinarySearch(pSeqList ps, DataType d);//二分查找


#endif//__SEQLIST_D_H__


SeqList.c

#include "SeqList_D.h"
void InitSeqList(pSeqList ps)
{
	ps->sz=0;//
	ps->capacity=DEFALUT_INC;
	ps->pdata=(DataType*)malloc(sizeof(DataType)*(DEFALUT_INC));
	if(ps->pdata==NULL)
		return;	
}
void DestroySeqList(pSeqList ps)
{
	ps->sz=0;
	ps->capacity=DEFALUT_INC;
	free(ps->pdata);//释放这个,并且之后要给空值
	ps->pdata=NULL;
}
int Check_Capacity(pSeqList ps)
{
	DataType* temp = ps->pdata;//预防开辟失败
	assert(ps);
	if(ps->capacity==ps->sz)
	{
		ps->pdata=(DataType*)realloc(ps->pdata,sizeof(DataType)*(ps->capacity+DEFALUT_INC));//realloc中还有个参数是内存起始地址

		if(ps->pdata==NULL)
		{ 
			ps->pdata=temp;
			return -1;
		} 
		else
		{
			ps->capacity=ps->capacity+DEFALUT_INC;
		}
		
	}
	return 1;

}
void PushBack(pSeqList ps, DataType d)
{
	int ret= Check_Capacity(ps);//这个动态开辟也就是在添加时候需要
	assert(ps);
	if(ret==1)
	{
		ps->pdata[ps->sz]=d;
		ps->sz++;
	}
}
void PrintSeqList(const pSeqList ps)
{
	int i = 0;
	for(i=0;i<ps->sz;i++)
	{
		printf("%d ",ps->pdata[i]);
	}
	printf("\n");
	return;
}
void PopBack(pSeqList ps)
{
	assert(ps);
	if(ps->sz==0)
	{
		return;
	}
	ps->sz--;
	return;

}
void PushFront(pSeqList ps, DataType d)
{
	int i = 0;
	int ret = Check_Capacity(ps);
	assert(ps);
	if(ret==1)
	{
		for (i=ps->sz;i>0;i--)
		{
			ps->pdata[i]=ps->pdata[i-1];
		}
		ps->pdata[0]=d;
		ps->sz++;
	}
}
void PopFront(pSeqList ps)
{
	int i = 0;
	assert(ps);
	if (ps->sz==0)
	{
		return;
	}
	for (i=0;i<ps->sz-1;i++)
	{
		ps->pdata[i]=ps->pdata[i+1];
	}
	ps->sz--;
	return;
}
void Insert(pSeqList ps, int pos, DataType d)
{
	int i = 0;
	int ret = Check_Capacity(ps);
	assert(ps);
	if (ret==1)
	{
		for (i=ps->sz;i>pos;i--)
		{
			ps->pdata[i]=ps->pdata[i-1];
		}
		ps->pdata[pos]=d;
		ps->sz++;
		
	}

	return;
}
int Find(pSeqList ps, DataType d)
{
	int i = 0;
	assert(ps);
	if(ps->sz!=0)
	{
		for (i=0;i<ps->sz;i++)
		{
			if(ps->pdata[i]==d)
				return i;
		}

	}
	return -1;
}
void Remove(pSeqList ps, DataType d)
{
	int ret = 0;
	int i = 0;
	assert(ps);
	if (ps->sz==0)
	{
		return;
	}
	ret = Find(ps,d);
	if (ret!=-1)
	{
		for (i=ret;i<ps->sz-1;i++)
		{
			ps->pdata[i]=ps->pdata[i+1];
		}
		ps->sz--;
	}
	return;
}
void ReverseSeqlist(pSeqList ps)
{

	int left = 0;
	int right = ps->sz-1;
	int tmp = 0;
	assert(ps);
	if (ps->sz==0)
	{
		return;
	}
	while(left<right)
	{
		tmp = ps->pdata[right];
		ps->pdata[right] = ps->pdata[left];
		ps->pdata[left] = tmp;
		left++;
		right--;
	}
	return;

}

void SortSeqlist(pSeqList ps)
{
	int i = 0;
	int j = 0;
	int tmp = 0;
	assert(ps);
	if (ps->sz==0)
	{
		return;
	}
	for (i=0;i<ps->sz-1;i++)
	{
		for (j=0;j<ps->sz-1-i;j++)
		{
			if (ps->pdata[j]>ps->pdata[j+1])
			{
				tmp = ps->pdata[j];
				ps->pdata[j] = ps->pdata[j+1];
				ps->pdata[j+1] = tmp;
			}
		}

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

}

test.c

#include "SeqList_D.h"
void test()
{
	SeqList s;
	InitSeqList(&s);
	PushBack(&s,1);
	PushBack(&s,2);
	PushBack(&s,5);
	PushBack(&s,4);
	PushBack(&s,3);
	PrintSeqList(&s);
	SortSeqlist(&s);
	PrintSeqList(&s);
	return;
}
int main()
{
	test();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值