1.1-线性表-顺序存储-数组实现

#include<stdio.h>
#include<Windows.h>

/*InitList(&L); 初始化表, 返回一个空的线性表
* Length(L);求表长,返回线性表的L的长度,即L中元素的个数
* LocateElem(L, e);按值查找,在表L中查找具有给定关键字值的元素
* GetElem(L, i); 按位查找,获取表中第i个位置上的元素的值
* ListInsert(&L, i, e);插入查找,在表中的第i的位置上插入指定元素e
* ListDelete(&l, i, &e); 删除操作,删除表L中的第i个位置上的元素,并用e返回删除元素的值
* PrintList(L);输出操作,按前后顺序输出线性表L的所有元素值
* Empty(L); 判空操作,若L为空表,则返回true,否则返回false
* DestroyList(&L);销毁操作,销毁线性表,并释放线性表L所占用的内存空间
*/

#define MaxSize 100 //此数组是静态数组,所以宏定义数组最大元素个数
typedef int ElemType;//别名数据元素的类型方便改动并且易懂
//定一个数据结构,包含数组线性表的和大小
typedef struct {
	ElemType list[MaxSize];
	int length;
}List, *ListPoint;



//InitList(&L); 初始化表, 返回一个空的线性表
bool InitList( ListPoint &L ){
	L = (ListPoint)malloc(sizeof(List));
	if (L != NULL) {
		L->length = 0;
		return true;
	}
	else {
		return false;
	}
}

//Length(L);求表长,返回线性表的L的长度,即L中元素的个数
int Length(ListPoint L){
	if (L != NULL) {
		return L->length;
	}
	else {
		return 0;
	}

}

//Full(L);判断是否满了
bool Full(ListPoint L) {
	if (L->length == MaxSize)
		return true;
	else
		return false;
}

//LocateElem(L, e);按值查找,在表L中查找具有给定关键字值的元素
//返回查找的元素的位置,第i个,如果没有查找到返回0
int LocateElem(ListPoint L, ElemType e) {
	for (int i = 0; i < L->length; i++) {
		if (L->list[i] == e) {
			return i+1;
		}
	}
	return 0;
}

// GetElem(L, i); 按位查找,获取表中第i个位置上的元素的值
ElemType GetElem(ListPoint L, int i) {
	if (i<1 || i > L->length) {
		return NULL;
	}
	else {
		return L->list[i - 1];
	}
}

//ListInsert(&L, i, e);插入查找,在表中的第i的位置上插入指定元素e
bool ListInsert(ListPoint L, int i, ElemType e) {
	if (Full(L)) {
		printf("线性表满了\n");
		return false;
	}
	else if (i<1 || i > L->length+1) {
		printf("ListInsert函数的位置参数输入错误\n");
		return false;
		}
	else{
		for (int n = L->length; n >= i; n--) {
			L->list[n] = L->list[n - 1];
		}
		L->list[i - 1] = e;
		L->length++;
		return true;
	}
}


//ListDelete(&l, i, &e); 删除操作,删除表L中的第i个位置上的元素,并用e返回删除元素的值
bool ListDelete(ListPoint L, int i, ElemType* e) {
	if (i > L->length || i < 1) {
		printf("ListDelete函数的位置参数错误\n");
		return false;
	}
	else {
		*e = L->list[i - 1];
		for (int n = i-1; n < L->length-1; n++) {
			L->list[n] = L->list[n+1];

		}
		L->length--;
	}
	return true;
}


// PrintList(L);输出操作,按前后顺序输出线性表L的所有元素值
void PrintList(ListPoint L) {
	for (int i = 0; i < L->length; i++) {
		printf("%3d", L->list[i]);
	}
	putchar('\n');
}


// Empty(L); 判空操作,若L为空表,则返回true,否则返回false
bool Empty(ListPoint L) {
	if (!L->length) {
		return true;
	}
	else {
		return false;
	}
}


// DestroyList(&L);销毁操作,销毁线性表,并释放线性表L所占用的内存空间
bool DestroyList(ListPoint L) {
	free(L);
	printf("表已经被删除\n");
	return true;
}




int main(int argc, char* argv) {

	ListPoint L;
	ElemType tmp = 0;
	if (InitList( L )) {
		printf("顺序表初始化成功\n");
	}
	else
	{
		printf("顺序表初始化失败\n");
	}
	printf("数据表的长度为:%d\n", Length(L));
	for (int i = 1; i <= MaxSize; i++) {
		ListInsert(L, i, i);
	}
	PrintList(L);
	for (int i = 1; i <= MaxSize; i += i) {
		if (ListDelete(L, i, &tmp)) {
			printf("已经删除第%d个元素%d\n", i, tmp);
			PrintList(L);
		}
	}
	DestroyList(L);
	PrintList(L);
	system("pause");
	return 0;
}
posted @   ant-king  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示