数据结构 线性结构 顺序表及其操作

数据结构都分为逻辑结构和物理结构,而顺序表在逻辑上就属于线性结构
1.什么是线性结构
线性结构就是在逻辑上数据的排列是一条直线,但是在物理结构中不一定是连续的,通常通过数组或链表的形式储存

2.线性数据结构有哪些
顺序表和链表

3.什么是顺序表
上面说了顺序表是一种线性结构,顺序表用一段连续的物理地址存储数据,一般采用数组形式,分为静态顺序表和动态顺序表

静态顺序表:用定长的数组存储
动态顺序表:用动态开辟的数组存储

//静态
#define N 100
struct SeqList{
	int array[N];
	size_t size;//有效元素个数
};

//动态
struct SeqList {
	int* array;//指向动态开辟的数组
	size_t size;//有效元素个数
	size_t capicity;//数组容量
};

因为静态不实用,咱们主要看动态
下面是动态顺序表的一些操作

typedef int DataType;
typedef struct SeqList {
	DataType* array;
	size_t capacity;//顺序表大小
	int size;//有效元素个数
}SeqList, *PSeq;

//初始化
void SeqListInit(PSeq ps, int capacity) {
	ps = malloc(capacity);
	if (ps == NULL) {
		ps = 20;
	}
	ps->size = 0;
}
//尾插
void SeqListPshBack(PSeq ps, DataType data) {
	ps->array[ps->size] = data;
	ps->size++;
}
//尾删
void SeqListPopBack(PSeq ps) {
	ps->size--;
}
//头插
void SeqListPushFront(PSeq ps, DataType data) {
	int k = 0;
	for (k=ps->size; k>0; k--) {
		ps->array[k] = ps->array[k - 1];
	}
	ps->array[0] = data;
	ps->size++;

}
//头删
void SeqListPopFront(PSeq ps) {
	int k = 1;
	for (k; k < (ps->size); ++k) {
		ps->array[k - 1] = ps->array[k];
	}
	ps->size--;
}
//在pos位置插入data
void SeqListInsert(PSeq ps, int pos, DataType data) {
	if (pos<1 || pos>(ps->size - 1)) {
		printf("位置错误/n");
	}
	else {
		int k = 0;
		for (k = (ps->size); k >= pos; k--) {
			ps->array[k + 1] = ps->array[k];
		}
		ps->array[pos] = data;
		ps->size++;
		return 1;
	}
	return 0;
}
//删除pos位置的元素
void SeqListErase(PSeq ps, int pos) {
	if (pos<1 || pos>(ps->size - 1)) {
		printf("位置错误/n");
	}
	else {
		int k = 0;
		for (k=pos; k < (ps->size); ++k) {
			ps->array[k] = ps->array[k + 1];
		}
		ps->size--;
	}

}

//查找值为data的元素
int SeqListFind(PSeq ps, DataType data) {
	for (int i = 0; i < (ps->size); ++i) {
		if (ps->array[i] == data) {
			return i;
		}
	}
	return -1;
}
// 检测顺序表是否为空,如果为空返回非0值,非空返回0 
int SeqListEmpty(PSeq ps) {
	if (ps->size == 0) {
		return 1;
	}
	return 0;
}

// 返回顺序表中有效元素的个数 
int SeqListSize(PSeq ps) {
	if (ps == NULL)
	{
		return 0;
	}
	return ps->size;
}

// 返回顺序表的容量大小 
int SeqListCapacity(PSeq ps) {
	if (ps == NULL)
	{
		return 0;
	}
	return ps->capacity;
}
// 将顺序表中的元素清空 
void SeqListClear(PSeq ps) {
	ps->size = 0;
}
// 删除顺序表中第一个值为data的元素 
void SeqListRemove(PSeq ps, DataType data) {
	for (int i = 0; i < (ps->size); ++i) {
		if (ps->array[i] == data) {
			for (int k = i + 1; k < (ps->size); ++k) {
				ps->array[k - 1] = ps->array[k];
				break;
			}
		}
		break;
	}
}
// 销毁顺序表 
void SeqListDestroy(PSeq ps) {
	ps->size = 0;
}
// 顺序表的扩容 
void BigCapacity(PSeq ps) {
	ps = realloc(ps, 300);
	if (ps==NULL) {
		ps = 20;
	}
}

猜你喜欢

转载自blog.csdn.net/nihuhui666/article/details/89457773