顺序表的创建

三个朋友今天全部上岸大厂,祝贺。(太羡慕了)

静态分配创建一个顺序表;

1.顺序表的定义:

#define MaxSize 10
typedef struct {
	ElemType data[MaxSize];
	int length;
}SqlList;

这里我们用结构体的方式定义以一个顺序表;用静态数组存放数据元素;定义一个存放表长度的变量;这里我们用了静态分配的方式定义了一个顺序表;

2.顺序表的初始化

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<string.h>
using namespace std;

#define MaxSize 10
typedef struct {
	int data[MaxSize];
	int length;
}SqlList;
//初始化一个顺序表
void InitList(SqlList &L) {
	
	for(int i = 0; i<MaxSize; i++) {
		L.data[i] = 0;
	}
	L.length = 0;
}
int main() {
	SqlList L;
	InitList(L); 
	return 0;
}

在main函数声明一个顺序表,这时候计算机就会为它分配一段连续的空间;这里分配的内存空间的大小就是MaxSIze*sizeof(数据类型);
还有一个点比较重要:
就是这段代码:

for(int i = 0; i<MaxSize; i++) {
		L.data[i] = 0;
	}

可能会想有必要吗?

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<string.h>
using namespace std;

#define MaxSize 10
typedef struct {
	int data[MaxSize];
	int length;
}SqlList;
//初始化一个顺序表
void InitList(SqlList &L) {
	L.length = 0;
}
int main() {
	SqlList L;
	InitList(L); 
	for(int i = 0;i<MaxSize;i++){
		printf("data[%d] = %d\n",i,L.data[i]);
	} 
	return 0;
}

我跑一下,你看看结果!!!
在这里插入图片描述
不初始化数组会出现内存中遗留的数据,这些“脏数据”当然不是我们想要的;原因是c它自己创建一个数组的时候不会初始化数组的元素;(这个自己一定要注意,java就没有这样的烦恼);
咱们静态创建一个顺序表,最大的坏处就是你没有办法衡量你的顺序表的长度,导致我们代码的健壮性是相当的差劲了;

指针即为地址,指针几个字节跟语言无关,而是跟系统的寻址能力有关;32位占4个字节,64位占8个字节;

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;

#define InitSize 10
typedef struct {
	int *data;//指示动态分配数组的指针 
	int MaxSize;//顺序表的最大容量 
	int length;//顺序表当前的长度 
} SeqList;//顺序表的类型定义(动态分配) 
//初始化一个顺序表
void InitList(SqlList &L) {
	L.data = (int *)malloc(InitSize*sizeof(int));
	L.length = 0;
	L.MaxSize = InitSize;
}
//动态增加数组的长度
void IncreaseSize(SeqList &L,int len){
	int *p = L.data;
	L.data=(int*)malloc((L.MaxSize+len)*sizeof(int));
	for(int i =0;i<L.length;i++){
		L.data[i] = p [i];
	}
	L.MaxSize = L.MaxSize + len;
	free(p);
} 
int main() {
	SqlList L;
	InitList(L);
	
	
	IncreaseSize(L,5);
	return 0;
}

malloc函数感觉挺好用的,数组的动态扩容比较重要;

void IncreaseSize(SeqList &L,int len){
	int *p = L.data;
	L.data=(int*)malloc((L.MaxSize+len)*sizeof(int));
	for(int i =0;i<L.length;i++){
		L.data[i] = p [i];
	}
	L.MaxSize = L.MaxSize + len;
	free(p);
} 

上次写还是大一了(惭愧);

#include<stdio.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;

#define InitSize 10
typedef struct {
	int *data;//指示动态分配数组的指针
	int MaxSize;//顺序表的最大容量
	int length;//顺序表当前的长度
} SeqList;//顺序表的类型定义(动态分配)
//初始化一个顺序表
void InitList(SeqList &L) {
	L.data = (int *)malloc(InitSize*sizeof(int));
	L.length = 0;
	L.MaxSize = InitSize;
}
//动态增加数组的长度
void IncreaseSize(SeqList &L,int len) {
	int *p = L.data;
	L.data=(int*)malloc((L.MaxSize+len)*sizeof(int));
	for(int i =0; i<L.length; i++) {
		L.data[i] = p [i];
	}
	L.MaxSize = L.MaxSize + len;
	free(p);
}
//插入操作
bool ListInsert(SeqList &L,int i,int e) {
	if(i<1 || i>L.length+1) {
		printf("数据规格错误");
		return false;
	}
	if(L.length >= L.MaxSize) {
		printf("当前存储空间已满,不能插入");
		return false;
	}
	for(int j = L.length; j>=i; j--) {
		L.data[j] = L.data[j-1];
	}
	L.data[i-1] = e;
	L.length++;
	return true;
}
//删除操作
bool ListDelete(SeqList &L,int i,int &e) {
	if(i<1 || i>L.length) {
		printf("数据规格不合法");
		return false;
	}
	e  = L.data[i-1];
	for(int j = i; j< L.length; j++ ) {
		L.data[j-1] = L.data[j];
	}
	L.length--;
	return true;
}
//顺序表的按位查找
void getList(SeqList L,int i) {
	if(i<1 || i>L.length) {
		printf("数据元素不合法\n");
	}else{
		printf("查找到的数据是%d\n",L.data[i-1]);
	}
}
//s顺序表按值查找
int *LocateElem(SeqList L,int e){
	static int a[10];
	int flag = 0;
	for(int i = 0;i<L.length;i++){
		if(L.data[i] == e){
		a[flag] = i;
		flag++;
		}
	}
	return a; 
}
//顺序表正序输出
void print(SeqList L){
	for(int i = 0;i < L.length ;i++){
		printf("data[%d]=%d\n",i,L.data[i]);
	}
} 
int main() {
	SeqList L;
	InitList(L);
	ListInsert(L,1,1);
	ListInsert(L,2,3);
	ListInsert(L,3,3);
	ListInsert(L,4,3);
	print(L);
	int *a= LocateElem(L,3);
	for(int i = 0 ;i<10;i++){
		if(*(a+i)!= 0){
			printf("%d\n",*(a+i));	
		}
	
	}
	
	return 0;
}
  • 20
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值