赞
踩
本文主要记录自己学习数据结构的过程与收获,欢迎各位批评指正。
目录
定义:顺序表是用顺序存储的方式实现的线性表。它是用一组地址连续的存储空间依次存储线性表中的数据元素,从而使逻辑上相邻的两个元素在物理上也相邻。
需要注意的是,由于顺序表中的任意一个数据元素都可以随机存取(即知道该元素的位序即可马上实现存取操作),所以线性表的顺序存储结构是一种随机存取的存储结构。
代码如下所示
- #include <stdio.h>
- #define MaxSize 10
-
- typedef struct { //定义顺序表结构体
- int data[MaxSize];
- int length;
- }SqList;
-
- void InitList(SqList* L){ //初始化数组
- for(int i = 0; i<MaxSize;i++){
- (*L).data[i] = 0;
- }
- (*L).length = 0; //初始化长度为0
- };
-
-
- int main() {
- SqList L;
- InitList(&L);
- for(int j =0;j<10;j++){
- printf("data[%d]=%d ",j,L.data[j]);
- }
- return 0;
- }
效果如下所示 :
在静态分配下,一旦顺序表的大小确定,后续需要修改长度是十分不易的,因此引入动态分配的方法使得顺序表长度可变。
将使用到malloc,free函数,需调用stdlib库。
malloc是动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址。
使用malloc函数时需注意:
1.要强制转换函数返回值为自己所需要的类型。
2.使用完成一定要释放空间,如果不释放会造内存泄漏。
3.在使用malloc函数开辟的空间中,不要进行指针的移动。
free函数可以用来释放malloc(或calloc、realloc)函数给指针变量分配的内存空间。
最本质的区别是 -> 前是结构体指针,而 . 前是结构体变量。
举个例子,在下面这段代码中定义一个顺序表L,其中:
L->data 中,L 为结构体指针;
L.data 中,L为结构体变量。
- #include <stdio.h>
- typedef struct {
- int data[MaxSize];
- int length;
- }SqList;
-
- int main(){
- SqList L; //定义顺序表L
- return 0;
- }
- #include<stdio.h>
- #include<stdlib.h>
- #define InitSize 10 //定义初始长度
- typedef struct //定义顺序表结构体
- {
- int *data; //指针指向顺序表第一个元素的地址
- int Maxsize; //顺序表最大容量
- int length; //当前长度(已存放了多少个元素)
- }SqList; //结构体名:SqList
-
- void InitList(SqList *L) //初始化顺序表
- {
- L->data = (int *)malloc(InitSize * sizeof(int)); //开辟一段连续的地址空间
- L->length = 0; //初始长度为0
- L->Maxsize = InitSize; //更新表的最大容量
- for (int i = 0; i < L->Maxsize;i++)
- L->data[i] = 0; //最初元素值为0
- }
- void IncreaseSize(SqList *L, int len) //增加表长
- {
- int *p = L->data; //存方原来顺序表的首地址,
- L->data = (int *)malloc((L->Maxsize + len) * sizeof(int)); //根据新增长度重新开辟一段连续的地址空间构建新的顺序表
- for (int i = 0; i < L->Maxsize;i++) //将原来表中内容拷贝到新表中
- L->data[i] = p[i];
- for (int i = L->Maxsize; i < (L->Maxsize+len);i++) //其余元素值值为0
- L->data[i] = 0 ;
- L->Maxsize = L->Maxsize + len; //更新当前表的最大容量
- free(p); //释放原来表的内存空间
- }
- int main(void)
- {
- SqList L; //创建一个顺序表L
- InitList(&L); //初始化
- printf("The initial list:\n");
- for(int j =0;j<10;j++){
- printf("data[%d]=%d ",j,L.data[j]);
- }
- printf("\n");
- IncreaseSize(&L,5); //增加顺序表长度
- printf("Increase the length of the list:\n");
- for(int j =0;j<15;j++){
- printf("data[%d]=%d ",j,L.data[j]);
- }
- return 0;
- }
效果如下所示:
毕竟是数据结构最开始的部分,内容逻辑上都比较简单,如果有出错或可以改进的地方,欢迎各位大佬留言指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。