顺序表Seqlist的基本操作的实现

版权声明:转用请注明出处 https://blog.csdn.net/weixin_39411321/article/details/89211767

顺序表基本操作的代码如下:

#include<stdio.h>
#include<iostream>
#include<string>
#include<malloc.h>
#define LIST_INIT_SIZE 10
#define LIST_INC_SIZE 2
typedef enum {
	OK = 1, ERROR = -1, POSERROR = -2, INITFAULT = -3, LISTEMPTY = -4, LISTFULL = -5, LISTNULL = -6
}Status;

using namespace std;
typedef int ElemType;

struct SeqList //顺序表的结构
{
	ElemType *data;
	int cursize;
	int maxsize;
};

int Init(SeqList &sp)//初始化顺序表
{
	sp.data = (ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
	if (NULL == sp.data)
	{
		return INITFAULT;
	}
	memset(sp.data, 0, sizeof(ElemType)*LIST_INIT_SIZE);
	sp.cursize = 0;
	sp.maxsize = LIST_INIT_SIZE;
}

void DestroyList(SeqList &st)//摧毁顺序表
{
	free(st.data);
	st.data = NULL;
	st.cursize = 0;
	st.maxsize = 0;
}

Status Insert(SeqList &sq, int pos, ElemType val)//按位置插入
{
	if (pos<0 || pos>sq.cursize)
		return POSERROR;
	for (int i = sq.cursize; i > pos; i--)
	{
		sq.data[i] = sq.data[i - 1];
	}
	sq.data[pos] = val;
	sq.cursize += 1;
	return OK;
}

bool Inc_Size(SeqList &seq) //顺序表的扩容
{
	ElemType *newdata = (ElemType*)malloc(sizeof(ElemType)*seq.maxsize*LIST_INC_SIZE);//开辟新内存
	if (NULL == newdata)//判断是否开辟成功
	{
		return false;
	}
	memmove(newdata, seq.data, sizeof(ElemType)*seq.maxsize);
	free(seq.data);
	seq.data = newdata;
	seq.maxsize = LIST_INC_SIZE * seq.maxsize;
	return true;
}

int Getsize(SeqList &seq)//得到顺序表的大小
{
	return seq.cursize;
}

int GetCapacity(SeqList &seq)//得到顺序表的容量
{
	return seq.maxsize;
}

bool EmptyList(SeqList &seq)//判断顺序表是否空
{
	return Getsize(seq) == 0;
}

bool FullList(SeqList &seq)//判断顺序表是否满
{
	return Getsize(seq) == seq.maxsize;
}

void Push_Back(SeqList &seq, ElemType val) //顺序表的尾部插入;
{
	Insert(seq, seq.cursize, val);
}

void Push_Front(SeqList &seq, ElemType val) //顺序表的头部插入;
{
	Insert(seq, 0, val);
}

Status EraseList(SeqList &seq, int pos)//按位置删除顺序表的值;
{
	if (EmptyList(seq))
	{
		return LISTNULL;
	}
	if (pos < 0 || pos >= seq.cursize)
	{ 
		return POSERROR;
	}
	for (int i = pos; i < seq.cursize - 1; i++)
	{
		seq.data[i] = seq.data[i + 1];
	}
	seq.cursize -= 1;
	return OK;
}

Status Remove(SeqList &seq, ElemType val)//按值删除顺表;
{
	for (int i = 0; i < seq.cursize; i++)
	{
		if (seq.data[i] == val)
			EraseList(seq, i);
	}
	return OK;
}

int main()
{
	int ar[] = { 12,23,12,23,34,45,56,12,67 };
	int n = sizeof(ar) / sizeof(ar[0]);
	SeqList mylist;
	Init(mylist);
	for (int i = 0; i < n; i++)//插入元素
	{
		Push_Back(mylist, ar[i]);
	}
	for (int i = 0; i < mylist.cursize; i++)//打印输出元素
	{
		cout << mylist.data[i] << " ";
	}
	cout << endl;

	int pos=0, val=0;
	Insert(mylist,pos,val);//按位置插入
	for (int i = 0; i < mylist.cursize; i++)//打印输出元素
	{
		cout << mylist.data[i] << " ";
	}
	cout << endl;
	Remove(mylist, 12);
	for (int i = 0; i < mylist.cursize; i++)//打印输出元素
	{
		cout << mylist.data[i] << " ";
	}

	cout << endl;
	DestroyList(mylist);
	cout << EmptyList(mylist) << endl;
	return 0;
}

运行结果对照如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39411321/article/details/89211767