2.2线性表的顺序存储和基本运算的实现

1 静态数组

2 动态数组

1 静态数组

  1 #define _CRT_SECURE_NO_WARNINGS
  2
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5
  6 //作为静态数组,无法变长,一旦分配内存,就固定了,不可以增加
  7 //外部的内存可以访问,但是外部内存可能被使用,也可能没有被使用
  8 //没有使用的情况下,越界偶尔会成功,还是可能被再次回收利用
  9 //已经使用,必然失败
 10 //a[n]等价于*(a+n);从数组名首地址开始,往下寻址,取出内容,数组不会检测越界
 11 //偶尔会成功,偶然的成功比必然的失败更加可怕,数组不可以越界
 12
 13 main1()
 14 {
 15     int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
 16
 17     printf("%x\n", a);
 18
 19     system("pause");
 20 }
 21
 22 //静态数组,不可以处理较大的数据
 23
 24 main2()
 25 {
 26     int b[1024 * 014 * 10];//默认数组在栈上,最大只能使用1MB
 27
 28     printf("%x\n", b);
 29
 30     system("pause");
 31 }
 32
 33 main3()
 34 {
 35     int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
 36     int i, j;
 37     int length = sizeof(a) / sizeof(int);
 38
 39     for (i = 0;i < length;i++)
 40     {
 41         printf("%d\n", a[i]);
 42     }
 43
 44     int num = 8;//要删除的元素
 45
 46     if (num == a[9])//检测最后一个元素
 47     {
 48         length = length - 1;//删除一个元素,元素在末尾
 49     }
 50     else
 51     {
 52         for (i = 0;i < length - 1;i++)//检测最后一个之前
 53         {
 54             if (a[i] == num)
 55             {
 56                 for (j = i;j < length - 1;j++)//从删除的位置开始,到最后一个全部向前移动
 57                 {
 58                     a[j] = a[j + 1];//逐个向前移动赋值
 59                 }
 60                 length = length - 1;
 61                 break;
 62             }
 63         }
 64     }
 65
 66     printf("尾部删除以后\n");
 67     for (i = 0;i < length;i++)
 68     {
 69         printf("%d\n", a[i]);
 70     }
 71
 72     system("pause");
 73
 74 }
 75
 76 //查询方便
 77 main4()
 78 {
 79     int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
 80     int i;
 81     int flag = 0;
 82     int length = sizeof(a) / sizeof(int);
 83
 84     for (i = 0;i < length;i++)//逐个访问数组每个元素
 85     {
 86         if (a[i] == 7)//查询
 87         {
 88             flag = 1;
 89             break;
 90         }
 91     }
 92
 93     if (flag == 1)
 94     {
 95         printf("找到");
 96     }
 97
 98     system("pause");
 99 }
100
101 //修改方便
102 main()
103 {
104     int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
105     int i;
106     int flag = 0;
107     int length = sizeof(a) / sizeof(int);
108
109     for (i = 0;i < length;i++)//逐个访问数组每个元素
110     {
111         if (a[i] == 7)//查询
112         {
113             flag = 1;
114             a[i] = 9;
115             break;
116         }
117     }
118
119     for (i = 0;i < length;i++)
120     {
121         printf("%d\n", a[i]);
122     }
123
124     system("pause");
125 }

2 动态数组

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <stdbool.h>
  4
  5 struct Arr
  6 {
  7     int *pBase;//存储的是数组第一个元素的地址
  8     int len;//数组所能容纳的最大元素的个数
  9     int cnt;//当前数组有效元素的个数
 10 };
 11
 12 typedef struct Arr ARR;
 13
 14 void init_arr(ARR *pArr, int length);//初始化
 15 bool append_arr(ARR *pArr, int val);//追加
 16 bool insert_arr(ARR *pArr, int pos, int val);//插入,pos值从1开始
 17 bool delete_arr(ARR *pArr, int pos, int * pVal);//删除元素
 18 int get();//暂无实现
 19 bool is_empty(ARR *pArr);//判断是否为空
 20 bool is_full(ARR *pArr);//判断是否已满
 21 void sort_arr(ARR *pArr);//排序
 22 void show_arr(ARR *pArr);//打印
 23 void inversion_arr(ARR *pArr);//逆序
 24
 25 void main()
 26 {
 27     struct Arr arr;
 28     int val = 0;//保存删除以后的元素
 29
 30     init_arr(&arr, 6);//初始化
 31
 32     show_arr(&arr);//打印
 33
 34     append_arr(&arr, 1);//追加
 35     append_arr(&arr, 2);
 36     append_arr(&arr, 3);
 37     append_arr(&arr, 4);
 38     append_arr(&arr, 5);
 39
 40     insert_arr(&arr, 6, 99);//插入,pos值从1开始
 41
 42     show_arr(&arr);//打印
 43
 44     if (delete_arr(&arr, 1, &val))//删除元素
 45     {
 46         printf("删除成功\n");
 47         printf("你所删除的元素是%d\n", val);
 48     }
 49     else
 50     {
 51         printf("删除失败\n");
 52     }
 53
 54     show_arr(&arr);//打印
 55
 56     inversion_arr(&arr);//逆序
 57     show_arr(&arr);//打印
 58
 59     sort_arr(&arr);//排序
 60     show_arr(&arr);//打印
 61
 62     system("pause");
 63 }
 64
 65 void init_arr(ARR *pArr, int length)//初始化
 66 {
 67     pArr->pBase = (int *)malloc(sizeof(int) * length);
 68     if (pArr->pBase == NULL)
 69     {
 70         printf("内存分配失败\n");
 71     }
 72     else
 73     {
 74         pArr->len = length;
 75         pArr->cnt = 0;
 76     }
 77 }
 78
 79 bool append_arr(ARR * pArr, int val)//追加
 80 {
 81     if (is_full(pArr))//满了
 82     {
 83         return false;
 84     }
 85     else
 86     {
 87         pArr->pBase[pArr->cnt] = val;
 88         (pArr->cnt)++;
 89         return true;
 90     }
 91 }
 92
 93 bool insert_arr(ARR * pArr, int pos, int val)//插入,pos值从1开始
 94 {
 95     int i;
 96     if (is_full(pArr))//满了
 97     {
 98         return false;
 99     }
100     if (pos<1 || pos>pArr->cnt + 1)
101     {
102         return false;
103     }
104     for (i = pArr->cnt - 1; i >= pos - 1; i--)
105     {
106         pArr->pBase[i + 1] = pArr->pBase[i];
107     }
108     pArr->pBase[pos - 1] = val;
109     pArr->cnt++;
110     return true;
111 }
112
113 bool delete_arr(ARR * pArr, int pos, int * pVal)//删除元素
114 {
115     int i = 0;
116     if (is_empty(pArr))//空了
117     {
118         return false;
119     }
120     if (pos<1 || pos>pArr->cnt)
121     {
122         return false;
123     }
124
125     *pVal = pArr->pBase[pos - 1];//保存将要删除的元素
126
127     for (i = pos; i < pArr->cnt; i++)
128     {
129         pArr->pBase[i - 1] = pArr->pBase[i];
130     }
131     pArr->cnt--;
132     return true;
133 }
134
135 bool is_empty(ARR * pArr)//判断是否为空
136 {
137     if (pArr->cnt == 0)
138     {
139         return true;
140     }
141     else
142     {
143         return false;
144     }
145 }
146
147 bool is_full(ARR * pArr)//判断是否已满
148 {
149     if (pArr->len == pArr->cnt)
150     {
151         return true;
152     }
153     else
154     {
155         return false;
156     }
157 }
158
159 void sort_arr(ARR * pArr)//排序
160 {
161     int i = 0, j = 0;
162     int t = 0;
163
164     for (i = 0; i < pArr->cnt - 1; i++)//冒泡
165     {
166         for (j = 0; j < pArr->cnt - 1 - i; j++)
167         {
168             if (pArr->pBase[j]>pArr->pBase[j + 1])
169             {
170                 t = pArr->pBase[j];
171                 pArr->pBase[j] = pArr->pBase[j + 1];
172                 pArr->pBase[j + 1] = t;
173             }
174         }
175     }
176 }
177
178 void show_arr(ARR *pArr)//打印
179 {
180     if (is_empty(pArr))
181     {
182         printf("数组为空\n");
183     }
184     else
185     {
186         int i = 0;
187         for (i = 0; i < pArr->cnt; i++)
188         {
189             printf("%d ", pArr->pBase[i]);
190         }
191         printf("\n");
192     }
193 }
194
195 void inversion_arr(ARR *pArr)//逆序
196 {
197     int i = 0;
198     int j = pArr->cnt - 1;
199     int t = 0;
200     while (i < j)
201     {
202         t = pArr->pBase[i];
203         pArr->pBase[i] = pArr->pBase[j];
204         pArr->pBase[j] = t;
205         i++;
206         j--;
207     }
208 }
时间: 2024-10-14 05:37:34

2.2线性表的顺序存储和基本运算的实现的相关文章

线性表的顺序存储结构

1.顺序表: 线性表占用的存储空间=n*sizeof(ElemType) n为线性表的长度,ElemType为线性表的元素类型,sizeof(ElemType)为每个元素所占存储空间大小(即字节数) 线性表的顺序存储结构利用数组实现,数组的基本类型是线性表中元素类型,数组大小大于等于线性表的长度. 基本运算实现: (1)建立顺序表 void CreateList(SqList *&L,ElemType a[],int n)    //由a中的n个元素建立顺序表 {  int i;    L=(S

线性表之顺序存储结构实现(上)

一,线性表的概念以及数学定义 1.线性表的概念 零个或多个数据元素的有限序列.首先说明这是一个序列,也就是说数据元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且仅有一个前驱和后继. 2.数学定义 若将线性表记为(a1...ai-1,ai,ai+1....an),则线性表中,ai-1领先于ai,ai领先于ai+1,则称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素,当i=1,2....n-1的时候,ai有且仅有一个直接后继元素,当i=2,3

线性表之顺序存储结构(C语言动态数组实现)

线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链式存储结构:是用一段一段连续的内存空间存储表中每一行的数据,段与段之间通过一个引用(指针)相互连接来,形成一个链式的存储结构 看到顺序存储结构的图示,我们可能会马上联想到C语言的数组.是的,数组就是一种典型的顺序存储数据结构.下面我通过一个实例,来实现对顺序存储结构中的数据增.删.改.查的操作. 首

线性表的顺序存储结构之顺序表类的实现_Java

在上一篇博文--线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构--顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放线性表的数据元素,元素在内存的物理存储次序与它们在线性表中的逻辑次序相同,即元素ai与其直接前驱ai-1及直接后继ai+1的存储位置相邻.顺序存储的线性表也成为顺序表(sequential list). 顺序表类SeqList提供线性表基于顺序存储结构的一种实现,它有两个私有成员变量table和n,

02.线性表(一)顺序存储结构

顺序存储结构 一.线性表基本概念 1.线性表定义 线性表(list)是指零个或多个数据元素的有限序列,所有数据元素为相同数据类型且一个数据元素可以由多个数据项组成.若将线性表记为(a1,..ai-1,ai,ai+1...,an),线性表元素的个数n(n>0,n=0时为空表)定义为线性表的长度,其中ai-1是ai 的直接前驱元素,ai+1是ai的直接后继元素. 2.线性表的抽象数据类型 ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,....an},每个元素的类型均匀Da

数据结构之线性表之顺序存储结构(3)

1 前言 经过前两张的理论基础,我相信大家都能简单的明白了数据结构和算法一些常用的概念了,从今天开始我们开始学习数据结构中线性表,一起叩响数据结构的大门. 2 详述 线性表(List):零个或者多个数据元素的有限序列. 如果用数学语言来进行定义: (声明:由于下标不是很好弄出来,所以只能表示下面这种方式了,请见谅!) 若线性表记作(a1,...ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素.当i

2.2_线性表的顺序存储结构

[线性表的顺序存储从结构] 指的是用一段连续的存储单元一次储存线性表的数据元素. [线性表的顺序存储的结构代码] #define MAXSIZE 20 /*存储空间初始分配量*/ typedef int ElemType; /*ElemType类型依实际情况而定*/ typedef struct { Element data[MAXSIZE]; /*数组存储数据元素,最大值为MAXSIZE*/ int length; /*线性表当前长度为length*/ }SqlList; [线性表的顺序存储结

简要比较线性表的顺序存储结构和链式存储结构

我们分别从存储分配方式.时间性能.空间性能三方面来做对比. 存储分配方式 顺序存储结构用一段连续的存储单元依次存储线性表的数据元素. 单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 时间性能 <1>查找 顺序存储结构O(1) 单链表O(n) <2>插入和删除 顺序存储结构需要平均移动表长一半的元素,时间为O(n) 单链表在计算出某位置的指针后,插入和删除时间仅为O(1) 空间性能 顺序存储结构需要预分配存储空间,分大了,容易造成空间浪费,分小了,容易发生溢出. 单链

《大话数据结构》笔记(2)--线性表的顺序存储结构

线性存储结构的Java实现代码: https://github.com/Lyu0709/data-structure/tree/master/src/com/coding/basic/array 第三章 线性表 定义 数学语言 若将线性表记为(a1, ..., ai-1, ai, ai+1, ..., an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素.当i=1,2,..,n-1时,ai有且仅有一个直接后继,当n=2,3,...,n