数据结构线性表——顺序表(C语言实现)

大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Spring系列框架、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

  • CSDN java领域新星创作者blog.csdn.net/bug..
  • 掘金LV3用户 juejin.cn/user/bug..
  • 阿里云社区专家博主,星级博主,developer.aliyun.com/bug..
  • 华为云云享专家 bbs.huaweicloud.com/bug..

    <font color=red> 最最简单的数据结构,数据结构入门必备,新手必备顺序表! </font>

    @toc

    本节目标

    • 了解线性表结构
    • 能够自己实现顺序表
    • 顺序表oj题

    1.线性表概念

    1线性表线性表(linear list)

    是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

    数组结构形式 链表结构形式

    我们今天来实现顺序表结构,即数组结构形式的顺序表。 2.顺序表实现 3.顺序表相关OJ题练习

    顺序表实现

    概念

    顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

    结构

    • 1 静态顺序表:使用定长数组存储。
    • 2 动态顺序表:使用动态开辟的数组存储。

    静态顺序表

    顺序表都以数组形式,静态顺序表示定长数组。

    //顺序表的静态存储
        #define N 7   //定长为7个元素的顺序表
        typedef int SLDataType;
        typedef struct SeqList 
        {
            SLDataType array[N];  //定长数组
            size_t size;   //有效元素个数
        }SeqList;
    
    

    这就是静态顺序表, 很明显当顺序表能存下数据的个数是有限的。所以极其不便。我们静态顺序表就介绍到这。

    动态顺序表

    //顺序表的动态存储
        typedef int SLDataType;
        typedef struct SeqList 
        {
            SLDataType *array;  //指向动态开辟的数组
            size_t size;   //有效元素个数
            size_t capicity; //容量空间大小 
        }SeqList;
    
    

    如何实现动态开辟数呢?

    void *malloc( size_t size );

    <stdlib.h>

    Allocates memory blocks. 这是个动态开辟内存空间的函数。 函数的返回值:void*无类型的指针,需要根据自己开辟数据类型的指针强制转换。 函数的常数:size_t字节大小,根据自己需要开辟空间大小。

    接口实现

    静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。

    线性表就是存数据的一种数据结构,而增删查改等接口的实现是这种数据结构的学习的基础!

    // 顺序表的动态存储
    typedef struct SeqList
    {
    SLDataType* array;  // 指向动态开辟的数组
    size_t size ;       // 有效数据个数
    size_t capicity ;   // 容量空间的大小
    }SeqList;
    // 基本增删查改接口
    // 顺序表初始化
    void SeqListInit(SeqList* psl);
    // 顺序表销毁
    void SeqListDestory(SeqList* psl);
    // 顺序表打印
    void SeqListPrint(SeqList* psl);
    // 检查空间,如果满了,进行增容
    void CheckCapacity(SeqList* psl);
    // 顺序表尾插
    void SeqListPushBack(SeqList* psl, SLDataType x);
    // 顺序表尾删
    void SeqListPopBack(SeqList* psl);
    // 顺序表头插
    void SeqListPushFront(SeqList* psl, SLDataType x);
    // 顺序表头删void SeqListPopFront(SeqList* psl);
    // 顺序表查找
    int SeqListFind(SeqList* psl, SLDataType x); 
    // 顺序表在pos位置插入x
    void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
    // 顺序表删除pos位置的值
    void SeqListErase(SeqList* psl, size_t pos);
    
    
    // 顺序表初始化
    void SeqListInit(SeqList* psl)
    {
    		psl->array = NULL;
    		psl->size = 0;
    		psl->capacity = 0;
    }
    
    
    // 顺序表销毁
    void SeqListDestory(SeqList* psl)
    {
    	free(psl->array);   //释放空间,防止内存泄漏
    	psl->array = NULL;
    }
    
    
    // 顺序表打印
    void SeqListPrint(SeqList* psl)
    {    
    	int i = 0;
    	 for(i=0;i<psl->size;i++)
    	 { 
    	  printf("%d ",psl->array[i]);
    	 }
    	 printf("\n");
    }
    
    
    // 检查空间,如果满了,进行增容
    void SeqListCheckCapacity(SeqList* psl)
    {
    	// 满了就要扩容
    	if (psl->size == psl->capacity)
    	{
    		int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
    		SLDataType* tmp = (SLDataType*)realloc(psl->array, newcapacity * sizeof(SLDataType));
    		if (tmp == NULL)
    		{
    			printf("realloc fail\n");
    			exit(-1);
    		}
    		else
    		{
    			psl->array = tmp;
    			psl->capacity = newcapacity;
    		}
    	}
    }
    
    
    
      // 顺序表尾插
    void SeqListPushBack(SeqList* psl, SLDataType x)
    {
    	SeqListCheckCapacity(psl);
    	psl->array[psl->size] = x;
    	psl->size++;
    }
    
    

    // 顺序表头插
    void SeqListPushFront(SeqList* psl, SLDataType x)
    {
    	SeqListCheckCapacity(psl);
    	int i = 0;
    	for (i = psl->size; i >0; i--)
    	{
    		 psl->array[i]=psl->array[i-1];
    	}
    
    	psl->array[i] = x;
    	psl->size++;
    }
    
    

    //顺序表尾删
    void SeqListPopBack(SeqList* psl)
    {
    	psl->size--;
    }
    
    

    // 顺序表头删
    void SeqListPopFront(SeqList* psl)
    {
    
    	int end = 0;
    	while (end<psl->size)
    	{
    		psl->array[end] = psl->array[end+1];
    		end++;
    	}
    	psl->size--;
    }
    
    

    // 顺序表查找
    int SeqListFind(SeqList* psl, SLDataType x)
    {
    	if (psl == NULL)
    		return 0;
    	int i = 0;
    	for (i = 0; i < psl->size; i++)
    	{
    		if (psl->array[i] == x)
    		{
    			printf("找到了、下标为:%d\n", i);
    			return i;
    	    }
    	}
    	printf("找不到\n");
    	return -1;
    }
    
    

    // 顺序表在pos位置插入x
    void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)
    {
    	SeqListCheckCapacity(psl);
    	if (psl->size > pos)
    	{
    		int i = 0;
    		for (i = psl->size; i>pos; i--)
    		{
    			psl->array[i] = psl->array[i - 1];
    		}
    		psl->array[i] = x;
    		psl->size++;
    	
    	}
    	else
    	{
    		printf("该位置不存在\n");
    
    	}
    	
    }
    
    

    // 顺序表删除pos位置的值
    void SeqListErase(SeqList* psl, size_t pos)
    {
    	if (psl == NULL)
    		return 0;
    	if (psl->size > pos)
    	{
    		int i = 0;
    		for (i = pos; i < psl->size-1; i++)
    		{
    			psl->array[i] = psl->array[i + 1];
    		}
    		psl->size--;
    	}
    		
    
    }
    
    

    <font color=red> 期待大佬的关注和点赞,感谢指导! 持续更新....... </font>

    #C语言##数据结构#
    全部评论
    看明白了,谢谢楼主分享啊
    点赞 回复 分享
    发布于 2022-10-18 15:01 山西

    相关推荐

    点赞 评论 收藏
    分享
    Yki_:你要算时间成本呀,研究生两三年,博士三四年,加起来就五六年了,如果你本科去腾讯干五年,多领五年的年薪,加上公司内涨薪,可能到时候十五年总薪资也跟博士差不多
    点赞 评论 收藏
    分享
    董春花_:真诚无罪,别听评论区那个清华的。按他的逻辑,你有分寸人觉得你是不想来,你积极热情人觉得你太想来,你好骗人就可你养鱼,你不好骗人觉得你服从性不高,合着**做啥都白扯。保持谦逊礼貌与对offer的积极性不才是最正常,也正确的做法么?招聘方的错强加到应聘者身上,***何不食肉糜。
    点赞 评论 收藏
    分享
    评论
    2
    1
    分享

    创作者周榜

    更多
    牛客网
    牛客网在线编程
    牛客网题解
    牛客企业服务