数据结构:线性表的顺序实现2.2

简介: 对于一个线性表如果我们使用顺序的实现,那么在insert或者delete一个值的时候最坏渐进时间复杂度 趋近于数据的规模n及 f(n)=O(n); 可以看到这个时候代价比较高,所以我们一般使用链试实现,关于这个算法我用C语言进行如下实现。
对于一个线性表如果我们使用顺序的实现,那么在insert或者delete一个值的时候最坏渐进时间复杂度
趋近于数据的规模n及
f(n)=O(n);
可以看到这个时候代价比较高,所以我们一般使用链试实现,关于这个算法我用C语言进行如下实现。
当使用链试实现的时候代替 时间复杂度为O(1) 出于演示并没有写free 释放内存
但是我们也可以想到关于固定位置的元素查找顺序实现其时间复杂度为O(1),而链表结构则为O(n)

点击(此处)折叠或打开

  1. /*************************************************************************
  2.     > File Name: sqlist.c
  3.     > Author: gaopeng
  4.     > Mail: gaopp_200217@163.com
  5.     > Created Time: Tue 04 Oct 2016 09:12:11 PM CST
  6.  ************************************************************************/

  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #include<string.h>
  10. #define INITSIZE 10

  11. typedef unsigned int uint;
  12. typedef int Etype;

  13. typedef struct sqlist
  14. {
  15.         Etype* elem; //pointer of sqlist base address
  16.         uint length; //current length of elem
  17.         uint m_size; //
  18. } SQLIST;



  19. void initsqlist(SQLIST* inlist)
  20. {
  21.         inlist->elem = (Etype* )malloc(sizeof(Etype)*(INITSIZE+2) + 1);
  22.         inlist->length = 0;
  23.         inlist->m_size = INITSIZE; //maxsize
  24. }


  25. void initsqlinsert(SQLIST* inlist,Etype ielem,uint postion) //insert elem before postion
  26. {
  27.         int i;
  28.         Etype* newbase;
  29.         if(postion > inlist->length + 1 || postion < 1)
  30.         {
  31.                 printf("line table must continuous or postion must>0!\n");
  32.                 exit(1);
  33.         }

  34.         if(inlist->length + 1 >= inlist->m_size ) //if memory small will give more memory
  35.         {
  36.                 if(!(newbase =(Etype* )realloc(inlist->elem,(inlist->length+INITSIZE+2)* sizeof(Etype)+1)))
  37.                 {
  38.                         printf("mem alloc failed!\n");
  39.                         exit(2);
  40.                 }
  41.                 inlist->elem = newbase;
  42.                 inlist->m_size = inlist->m_size+INITSIZE;
  43.         }

  44.         for(i=0;i<(inlist->length-postion+2);i++) //every elem +1
  45.         {
  46.                 *(inlist->elem+inlist->length+1-i) = * (inlist->elem+inlist->length-i);
  47.         }
  48.         *(inlist->elem+inlist->length+1-i) = ielem; //give value
  49.         inlist->length =inlist->length+1;
  50. }

  51. void delsqldel(SQLIST* inlist,uint postion) //delete elem of postion every elem -1
  52.         int i;
  53.         if((postion > inlist->length) ||(postion <1))
  54.         {
  55.                 printf("give postion is must large than 1 and less than current length\n");
  56.         }

  57.         for(i=0;i<(inlist->length-postion) ;i++)
  58.         {
  59.                 *(inlist->elem+postion+i) = *(inlist->elem+postion+i+1);
  60.         }
  61.         inlist->length =inlist->length-1;
  62. }

  63. void view(SQLIST* inlist)
  64. {
  65.         int i;
  66.         if(inlist->length ==0 )
  67.         {
  68.                 printf("init data arrary! no data found!\n");
  69.                 exit(3);
  70.         }
  71.         for(i=0;i<inlist->length;i++)
  72.         {
  73.                 printf("node:%d values is:%d data length:%d max_size:%d \n",i,*(inlist->elem+i),inlist->length,inlist->m_size);
  74.         }
  75. }


  76. int main(void)
  77. {
  78.     SQLIST a;
  79.         initsqlist(&a);
  80.         printf("insert two values\n");
  81.         initsqlinsert(&a,5,1);
  82.         initsqlinsert(&a,10,1);
  83.         view(&a);

  84.         printf("delete one values\n");
  85.         delsqldel(&a,2);

  86.         view(&a);

  87.         printf("insert more than 10 values\n");
  88.         initsqlinsert(&a,10,1);
  89.         initsqlinsert(&a,20,1);
  90.         initsqlinsert(&a,30,1);
  91.         initsqlinsert(&a,40,1);
  92.         initsqlinsert(&a,50,1);
  93.         initsqlinsert(&a,10,1);
  94.         initsqlinsert(&a,10,1);
  95.         initsqlinsert(&a,10,1);
  96.         initsqlinsert(&a,10,1);
  97.         initsqlinsert(&a,10,1);
  98.         initsqlinsert(&a,10,1);
  99.         view(&a);


  100.         return 0;
  101. }

运行如下:
gaopeng@bogon:~/datas/part2$ ./a.out 
insert two values
node:0 values is:10 data length:2 max_size:10 
node:1 values is:5 data length:2 max_size:10 
delete one values
node:0 values is:10 data length:1 max_size:10 
insert more than 10 values
node:0 values is:10 data length:12 max_size:20 
node:1 values is:10 data length:12 max_size:20 
node:2 values is:10 data length:12 max_size:20 
node:3 values is:10 data length:12 max_size:20 
node:4 values is:10 data length:12 max_size:20 
node:5 values is:10 data length:12 max_size:20 
node:6 values is:50 data length:12 max_size:20 
node:7 values is:40 data length:12 max_size:20 
node:8 values is:30 data length:12 max_size:20 
node:9 values is:20 data length:12 max_size:20 
node:10 values is:10 data length:12 max_size:20 
node:11 values is:10 data length:12 max_size:20 


上图演示的是删除data3的方式。插入相反
相关文章
|
存储 C语言
数据结构中的线性表链式存储介绍及其基本操作
链式存储是线性表的一种重要存储方式,它通过节点和指针的结构,实现了灵活的动态存储管理。本文介绍了单向链表的基本操作,并提供了相应的C语言代码示例。理解和掌握链表的操作对学习和应用数据结构具有重要意义。希望这篇博客能帮助你更好地理解线性表的链式存储。
368 2
|
10月前
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
255 7
|
10月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
387 5
|
10月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
224 5
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
130 0
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
142 6
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
105 1
|
12月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
165 0
|
存储 C语言
数据结构之线性表的初始化及其操作
数据结构之线性表的初始化及其操作
196 0

热门文章

最新文章

下一篇
开通oss服务