数据结构——数组

说明:严蔚敏的《数据结构》(C语言版)学习笔记,记录一下,以备后面查看。

ElemType *elem记录第一个元素的地址,也就是数组的首地址(基地址)

int length 是实际数组中数据的长度

int listsize 是给数组分配的空间长度

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define LIST_INIT_SIZE  100  //线性表存储空间的初始分配量
#define LISTINCREMENT   10   //线性表存储空间的分配增量
const int OK = 1;  //定义正确返回
const int ERROR  = -1;  //定义错误的返回
const int OVERFLOW = -2; //定义溢出

//定义元素类型
typedef int ElemType;
//定义返回类型
typedef int Status;
//定义一个线性的数组结构
typedef struct{
	ElemType *elem;
	int length;
	int listsize;
} SqList;

//初始化列表
Status InitList_Sq(SqList &L){
	//构造一个空的线性表L
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
	if(!L.elem) exit(OVERFLOW); //存储分配失败
	L.length = 0; //实际元素长度是0
	L.listsize = LIST_INIT_SIZE;//分配的长度(字节)
	return OK;
}

//插入元素
//插入数组中下标为i的位置
Status ListInsert_Sq(SqList &L, int i, ElemType e){
	ElemType *newbase;
	//在顺序线性表L中第i个位置之前插入新的元素e
	if(i<1 || i>L.length+1) return ERROR;  //i 值不合法
	if(L.length >= L.listsize){ //如果数组元素满了就扩展
		newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
		if(!newbase) exit(OVERFLOW);
		L.elem = newbase; //新基址
		L.listsize += LISTINCREMENT; //增加存储容量
	}
	ElemType *q = &(L.elem[i - 1]); //取到数组中第i个元素的地址赋给指针q
	ElemType *p;
	//从i+1元素位置开始向后移动元素
	for(p = &(L.elem[L.length - 1]); p>=q; --p) *(p+1) = *p;
	*q = e;
	++L.length;
	return OK;
}

//添加元素
Status ListAdd_tail(SqList &L, ElemType e){
	ElemType *newbase;
	if(L.length >= L.listsize){
		newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
		if(!newbase) exit(OVERFLOW);
		L.elem = newbase;
		L.listsize += LISTINCREMENT;
	}
	L.elem[L.length] = e;
	++L.length;
	return OK;
}

//删除元素
ElemType ListRemove_Sq(SqList &L, int i){
	if(i<0 || i>=L.length) return ERROR;
	ElemType *p;
	//将第i个元素后面的所有元素向前移动一位
	for(p = &(L.elem[i]); p<&(L.elem[L.length - 1]); ++p) *p = *(p+1);
	--L.length;
	return OK;
}

//遍历元素
void showList(const SqList &L){
	int i;
	for(i=0; i<L.length; i++){
	   printf("%d\n", L.elem[i]);
	}
}

int main(){
	SqList sq;
	InitList_Sq(sq);
	ElemType et1 = 3;
	ElemType et2 = 4;
	ListInsert_Sq(sq,1,et1);
	ListInsert_Sq(sq,2,et2);
	ListAdd_tail(sq, et1);
	ListAdd_tail(sq, et1);
	ListAdd_tail(sq, et1);
	ListAdd_tail(sq, et2);
	ListRemove_Sq(sq, 1);
	showList(sq);
	scanf("%d");
	return 0;
}

值得思考的问题:

1、为什么传引用?

2、什么时候应该什么成const?

3、结构体的初始化

4、静态存储区和动态存储区的特点和区别

时间: 2024-10-17 21:45:05

数据结构——数组的相关文章

【C/C++学院】0828-数组与指针/内存分配/数据结构数组接口与封装

[送给在路上的程序员] 对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现. 对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步. 对于一个开发团队而言,能在短期内开发出用户满意的软件系统是起核心竞争力的体现. 每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我. 数组与指针 #include<stdio.h> #include<stdlib.h> void main1() { int a[10]

数据结构-数组中出现次数超过一半的数字

题目:数字中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 分析:首先进行排序,因为大于一半,所以说经过排序之后的数组,如有次数大于的话说明那个数肯定是数组中间的那个数. #include <iostream> using namespace std; void QickSort(int *a,int n,int low,int high){ int i=l

java数据结构 - 数组使用的代码

在研发过程中,将开发过程比较好的内容珍藏起来,下面内容段是关于java数据结构 - 数组使用的内容,希望能对大伙有较大用. public class Array { private int[]Array; private int ArraySize; private int ArrayLength; private void GetArray(){ Array = new int[ArraySize]; if(Array == null) System.out.println("Memory A

算法整理篇之:数据结构 | 数组(1)

数组,是最基础的数据结构,因为其所代表的是一段连续序列(如果按照C++中的定义),或者从广义上来讲的一个集合. 结构特点: 1)索引(Index),又叫下标: 一般地,我们可以借鉴下标的思想,对数据进行标号,从而组织成为序列,最大的好处就是能够保证元素的唯一性,如同数据库的Primary Key. 这与”寻址“,”父亲表示法“,”指针“的思想是同出一辙的. 2)值(Value),又叫元素. 直接结果,当然,这个直接结果也可能就是一个索引,在算法中,常见形如:”a[[i+j]]“. 思想变种: 当

[数据结构] 数组与链表的优缺点和区别

概述 数组 是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中.同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素.如果应用需要快速访问数据,很少插入和删除元素,就应该用数组. 链表 中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储 数据元素 的 数据域,另一个是存储下一个结点地址的

数据结构 - 数组、矩阵、广义表存储

数组的定义 数组的定义 数组是下标index 和值value 组成的序对的集合. 在数组中,每个有定义的下标都与一个值对应,这个值称做数组元素. 每个序对形如: (index,value) 数组的顺序表示和实现 由于计算机的内存结构是一维的,因此用一维内存来表示多维数组,就必须按某种次序将数组元素排成一列序列,然后将这个线性序列存放在存储器中. 一般都是采用顺序存储的方法来表示数组 一维数组的顺序表示 设第一个数组元素a[0]的存储地址是loc(a[0]),若已知每个数组元素占k个存储单元,则下

数据结构 数组,链表,栈,队列理解

数据结构 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.再简单描述一下:数据结构就是描述对象间逻辑关系的学科. 数据存储结构 常用的数据存储方式有两种:顺序存储,非顺序存储.顺序存储就是把数据存储在一块联系的存储介质(硬盘或内存等)中.反之则是非顺序存储. Java中的数组就是典型的顺序存储,链表就是非顺序存储.数组存储数据时会开辟出一块联系内存,按顺序存储.链表先不会开辟出一块内存来,而是只需要知道下一个节点存储的位置,就能把所以的数据连起来了.所以单向链表的最后一个节点是指向N

数据结构 - 数组

数组与线性表的差异 我们以前应该学习过数组,数组与线性表的区别与联系呢? 它们的相同之处: (1)它们的相同之处,它们都是若干个相同数据类型的数据元素a0,a1,a2,-,an-1构成的有限序列 它们的不同之处: (1)数组要求其元素占用一块地址连续的内存单元空间,而线性表无此要求 (2)线性表的元素是逻辑意义上不可再分的元素,而数组中的每个元素还可以是一个数组 (3)数组的操作主要是向某个下标的数组元素中存放数据和取某个下标的数组元素,这与线性表的插入和删除操作不同 数组的定义 数组的逻辑定义

数据结构 数组笔记

/* 数组: 数组并不属于线性结构.数组是由类型相同的数据构成的有序集合 数组中的元素本身可以具有某种结构,而且元素的结构相同.数组 中的元素可以是一个单一的元素,也可以是一个线性表,因此数组 可以看做一般线性表的推广. 寻找数组中第k小的数 要查找第k小的数并不需要对整个数组进行排序,只需利用快速排序 的思想,每次将数据分成两堆,只要中间参量的的位置为k就不需要 再排序下去 */ /* 快速排序 快速排序是对冒泡排序的一种改进.基本思想是:通过一趟排序后将 需要排序的数据分割成独立的两部分,其