数据结构(一)顺序表

1.什么是数据结构?

        1.数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。

        2.精心选择的数据结构可以带来更高的运行或者存储效率,这往往同高效的检索算法和索引技术有关。

2.不同种类的数据结构特点

  1. 顺序表:一种较为简单的数据结构,元素的插入、删除、查找等操作均可以通过数组的索引进行,具有高效性。
  2. 链表:通过链式存储方法实现的一种线性表,元素的插入、删除无需移动大量元素,能够高效地处理大量元素的情况。
  3. 栈:一种特殊的线性表,只允许在表的一端进行插入和删除操作,通常被称为“后进先出”(LIFO)的数据结构。栈常被用于实现子程序调用和递归算法等功能。
  4. 队列:一种特殊的线性表,只允许在表的前端进行插入操作和在表的后端进行删除操作,通常被称为“先进先出”(FIFO)的数据结构。队列常被用于实现多线程的同步等功能。
  5. 树:一种非线性的数据结构,可以表示层次关系和分支关系。树的节点可以有多个子节点,每个子节点都包含一个指向其父节点的指针。树在计算机科学中被广泛应用,如文件系统、搜索引擎、操作系统等。
  6. 图:一种较为复杂的数据结构,可以表示任意两个元素之间的关系。图的顶点可以代表各种实体,边可以代表实体之间的关系。图在计算机科学中被广泛应用,如社交网络分析、交通路网规划、人工智能等领域。
  7. 哈希表:一种通过哈希函数将关键字映射到存储位置的数据结构。哈希表可以在常数时间内完成查找、插入、删除等操作,因此具有很高的效率。
  8. 堆:一种特殊的完全二叉树,其中的每个节点都大于或等于其子节点。堆常被用于实现优先队列等功能。

3.今天的主角《顺序表》

1.顺序表的结构大多由数组完成,在内存中申请一块完整的空间开辟数组,使用数组来存储数据

2.每一个数据结构都有增删查改功能,比如在顺序表的末尾插入一个数据,或者在下标为3的地方插入一个数据,这些功能通过整合,封装成不同的接口(函数)来提供给使用者

3.顺序表的优缺点

               优点:顺序表的内存空间连续,支持随机访问,可以高效地按下标进行操作,这使得在需要频繁访问元素时,顺序表可以提供较高的效率。

               缺点:在顺序表中间插入或删除元素时,都涉及到元素的移动,效率较低,这是因为在插入或删除元素时,为了保证顺序表的连续性,需要对元素进行移动。

4.先看一下顺序表的使用(这里使用打印界面调用)

void menu()
{
	printf("*****************************\n");
	printf("**** 1.头插    2.头删********\n");
	printf("**** 3.尾插    4.尾删********\n");
	printf("**** 5.查找    6.任插********\n");
	printf("**** 7.任删    8.查看********\n");
	printf("****     0.退出      ********\n");
	printf("*****************************\n");
}
void test(SeqList* ps)
{
	int input;
	do
	{
	    menu();

		这里调用顺序表的增删查改(略)

	} while (input);
}

int main()
{
	SeqList s;    1.创建一个顺序表
	SeqListInit(&s); 2.初始化一下
	test(&s);           3.对顺序表增删查改
	SeqListDestroy(&s);   4.销毁顺序表
	return 0;
}

5.用C语言写一个顺序表

顺序表的功能由如下:

typedef int SLDateType;
typedef struct SeqList    定义一个SeqList(顺序表)类型
{
	SLDateType* a;
	int size;
	int capacity;
}SeqList;

//初始化
void SeqListInit(SeqList* ps);
//退出
void SeqListDestroy(SeqList* ps);
//打印
void Seqlistprint(SeqList* ps);

//尾插
void SeqListPushBack(SeqList* ps);
//尾删
int SeqListPopBack(SeqList* ps);
//头插
void SeqListPushFront(SeqList* ps);
//头删
void SeqListPopFront(SeqList* ps);


//顺序表查找
void SeqListFind(SeqList* ps);
//任意位置插入
void SeqListInsert(SeqList* ps, int pos);
//任意位置删除
void SeqListErase(SeqList* ps, int pos);

功能实现

void ChckCapaity(SeqList* ps)
{
	
	if (ps->size == ps->capacity)
	{
		SLDateType* tmp = (SLDateType*)realloc(ps->a, ((ps->capacity)+2) * sizeof(SLDateType) );
		if (tmp == NULL)
		{
			perror("realloc:"); 
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity *= ps->capacity;
	}
}




void SeqListInit(SeqList* ps)
{
	ps->a = (SLDateType*)malloc(5 * sizeof(SLDateType));
	ps->size = 0;
	ps->capacity = 5;
}


void SeqListDestroy(SeqList* ps)
{
	free(ps->a);
	ps->a = NULL;
}


void Seqlistprint(SeqList* ps)
{
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}


void SeqListPushBack(SeqList* ps)
{
	ChckCapaity(ps);
	int input;
	printf("请输入\n");
	scanf("%d", &input);
	ps->a[ps->size] = input;
	ps->size++;
	printf("尾插成功\n");
}


int SeqListPopBack(SeqList* ps)
{
	if (ps->size == 0)
	{
		printf("无数据\n");
			return 1;
	}
	else
	{
		ps->size--;
		printf("尾删成功\n");
	}
}


void SeqListPushFront(SeqList* ps)
{
	ChckCapaity(ps);


	int i = 0;
	for(i = ps->size - 1; i >= 0; i--)
	{
		ps->a[i + 1] = ps->a[i];
	}
	int input;
	printf("请输入\n");
	scanf("%d", &input);
	ps->a[0] = input;
	ps->size++;
	printf("头插成功\n");


}


void SeqListPopFront(SeqList* ps)
{
	if (ps->size == 0)
	{
		printf("无数据\n");
		return 1;
	}
	int i = 0;
	for (i = 1; i <=ps->size; i++)
	{
		ps->a[i -1] = ps->a[i];
	}
	printf("头删成功\n");


	ps->size--;
}


void SeqListFind(SeqList* ps)
{
	int input = 0;
	printf("请输入要查找的内容\n");
	scanf("%d", &input);
	int i = 0;
	int flag = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == input)
		{
			printf("找到了是%d\n", ps->a[i]);
			flag = 1;
		}
	}
	if (flag == 0)
		printf("没找到\n");


}


void SeqListInsert(SeqList* ps, int pos)
{
	ChckCapaity(ps);
	int input = 0;
	int i = 0;
	for (i = ps->size-1; i >=pos-1; i--)
	{
		ps->a[i + 1] = ps->a[i];
	}
	printf("请输入要插入的数\n");
	scanf("%d", &input);
	ps->a[pos - 1] = input;


	ps->size++;
	printf("插入成功\n");
}


void SeqListErase(SeqList* ps, int pos)
{
	if (ps->size == 0)
	{
		printf("无数据\n");
		return 1;
	}
	int i = 0;
	for (i = pos; i <ps->size; i++)
	{
		ps->a[i - 1] = ps->a[i];
	}
	ps->size--;
	printf("已删除\n");
}

如果觉得还不错请点赞👍鼓励

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值