C语言数据结构-顺序表

总提

1.集合结构
2.线性结构特点:除了头尾,中间的每一个节点都存在一个前驱和后继且没有空存在。
3.树形结构特点:一对多,多个后继一个前驱
4.图特点:多对多
数据结构将现实的结构进行了数据结构化,基本就只有这四种关系
我们画在图纸上的结构称之为逻辑结构,将结构存放于内存中被称之为物理结构。当逻辑结构和物理结构接近时更容易代码实现,也更容易理解。

时间复杂度的主要决定因素为循环的次数,所以考虑问题是尽可能的减少循环的使用

顺序表

顺序表要连续存放包括的基本函数
1.insert()增
2.remove()删除
3.find()查
4.print()改
初级版本

#define LIST_INIT_SIZE 10
#define LIST_INC_SIZE  2

typedef int ElemType;
void Swap(ElemType &a,ElemType &b)
{
	ElemType c = a;
	a = b;
	b = c;
}

typedef enum {
	OK = 1,
	ERROR = -1,
	POSERROR = -2,
	INITFAULT = -3,
	INCFAULT = -4,
	FAULT = -5,
}Status; 

typedef struct
{
	Status tag;
	ElemType item;
}RetType;


typedef struct 
{
	ElemType *data;
	int  cursize; // 当前元素的个数
	int  maxsize; // CapacitySize;
}SeqList;

Status InitList(SeqList &seq)
{
	seq.data = (ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
	if (NULL == seq.data)
	{ 
		//exit(1); 
		return INITFAULT;
	}
	memset(seq.data, 0, sizeof(ElemType)*LIST_INIT_SIZE);
	//memmove; memcpy; memcmp;//strcpy;strcmp
	seq.cursize = 0;
	seq.maxsize = LIST_INIT_SIZE;
	return OK;
}
void DestroyList(SeqList &seq)
{
	free(seq.data);
	seq.data = NULL;
	seq.cursize = 0;
	seq.maxsize = 0;
}

void ClearList(SeqList &seq)
{
	seq.cursize = 0;
}
int GetSize(SeqList &seq)
{
	return seq.cursize;
}
int GetCapacity(SeqList &seq)
{
	return seq.maxsize;
}
bool Is_Empty(SeqList &seq)
{
	return GetSize(seq) == 0;
}
bool Is_Full(SeqList &seq)
{
	return GetSize(seq) == GetCapacity(seq);
}
bool Inc_Size(SeqList &seq)
{
	ElemType *newdata = (ElemType*)realloc(seq.data,sizeof(ElemType)*GetCapacity(seq)*LIST_INC_SIZE);
	if (NULL == newdata)
	{
		return false;
	}
	seq.data = newdata;
	seq.maxsize = seq.maxsize * LIST_INC_SIZE;
	return true;
}
Status InsertList(SeqList &seq, int pos, ElemType val)
{
	if (pos < 0 || pos > seq.cursize)
	{
		return POSERROR;
	}
	if (Is_Full(seq) && !Inc_Size(seq))
	{
		return INCFAULT;
	}
	for (int i = seq.cursize; i > pos; --i)
	{
		seq.data[i] = seq.data[i - 1];
	}
	seq.data[pos] = val;
	seq.cursize += 1;
	return OK;
}
Status Push_Back(SeqList &seq, ElemType val)
{
	return InsertList(seq, seq.cursize, val);
}
Status Push_Front(SeqList &seq, ElemType val)
{
	return InsertList(seq, 0, val);
}
Status EraseList(SeqList &seq,int pos)
{
	if (pos < 0 || pos > seq.cursize - 1)
	{
		return POSERROR;
	}
	for (int i = pos; i < seq.cursize - 1; ++i)
	{
		seq.data[i] = seq.data[i + 1];
	}
	seq.cursize -= 1;
	return OK;
}
Status Pop_Front(SeqList &seq)
{
	return EraseList(seq, 0);
}
Status Pop_Back(SeqList &seq)
{
	return EraseList(seq, seq.cursize-1);
}
Status Remove(SeqList &seq, ElemType val)
{
	int i = 0, j = 0;
	while (i < seq.cursize)
	{
		if(seq.data[i] != val)
		{
			seq.data[j] = seq.data[i];
			++j;
		}
		++i;
	}
	seq.cursize = j;
	return OK;
}
RetType GetFront(SeqList &seq)
{
	RetType res={FAULT};
	if(!Is_Empty(seq))
	{
		res.item = seq.data[0];
		res.tag = OK;
	}
	return res;// id name sex age addr 
}
RetType GetBack(SeqList &seq)
{
	RetType res={FAULT};
	if(!Is_Empty(seq))
	{
		res.item = seq.data[seq.cursize-1];
		res.tag = OK;
	}
	return res;// id name sex age addr 
}
void PrintList(SeqList &seq)
{
	int n = GetSize(seq);
	for(int i = 0;i < n;++i)
	{
		printf("%d ",seq.data[i]);
	}
	printf("\n");
}


int main()
{
	SeqList mylist;
	InitList(mylist);
	int n = 10;
	for(int i = 0;i<n;++i)
	{
		Push_Back(mylist,rand()% 100);
	}

	PrintList(mylist);
	PrintList(mylist);
	DestroyList(mylist);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40738945/article/details/85225270